做一个私人的方法公共单位测试它的好主意?

问题:

 Moderator Note: There are already 39 answers posted here (some have been deleted). Before you post your answer, consider whether or not you can add something meaningful to the discussion. You’re more than likely just repeating what someone else has already said.
我偶尔会发现自己需要在公共场合制作一个私人的方法来写一些单元测试。
通常这是因为该方法包含类中其他方法之间的逻辑共享,并且它会自己测试逻辑,或者另一个原因可能是我想测试同步线程中使用的逻辑,而不用担心线程问题。
别人发现自己这样做,因为我不喜欢这样做吗?我个人认为,奖金超过制作方法公开的问题,在课堂以外没有提供任何服务。
 UPDATE
感谢大家的回答,似乎激起了人们的兴趣。我认为普遍的共识是测试应该通过公共API发生,因为这是一个类将被使用的唯一方式,我同意这一点。上面提到的几个我在上面提到的情况是不常见的情况,我认为这样做的好处是值得的。
但是,我可以看到,大家都指出,这绝对不会发生。而且在考虑一下我想更改代码以适应测试是一个糟糕的想法 – 毕竟,我认为测试是一种支持工具,并且如果你愿意,将系统改变为“支持支持工具”,那就是公然的坏习惯

回答:

 注意:
这个答案最初是针对第2个问题被发布的,这个问题被合并到了这个问题上,所以这可能是一个特定于在这里提出的用例。

作为一般声明,我通常都是重构“生产”代码,以便于测试。不过,我认为这不是一个很好的打算。一个好的单元测试(通常)不应该关心类的实现细节,只关心它的可见行为。不要将内部堆栈暴露给测试,您可以测试该类在调用first()last()之后按照您期望的顺序返回页面。
例如,考虑这个伪代码:

public class NavigationTest {
    private Navigation nav;

    @Before
    public void setUp() {
        // Set up nav so the order is page1->page2->page3 and
        // we've moved back to page2
        nav = ...;
    }

    @Test
    public void testFirst() {
        nav.first();

        assertEquals("page1", nav.getPage());

        nav.next();
        assertEquals("page2", nav.getPage());

        nav.next();
        assertEquals("page3", nav.getPage());
    }

    @Test
    public void testLast() {
        nav.last();

        assertEquals("page3", nav.getPage());

        nav.previous();
        assertEquals("page2", nav.getPage());

        nav.previous();
        assertEquals("page1", nav.getPage());
    }
}

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Making a private method public to unit test it…good idea?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 28 = 35