提问人:mattalxndr 提问时间:4/20/2016 最后编辑:Dave Schweisguthmattalxndr 更新时间:4/23/2016 访问量:1789
在测试类中,在断言中使用主题类的常量是个好主意吗?[关闭]
Is it a good idea in a test class to use constants of the subject class in assertions? [closed]
问:
在断言中使用主题类的常量是否被认为是不好的做法?
@Test
public void testSubjectMethod() throws Exception {
Subject subject = new Subject()
String result = subject.subjectMethod();
Assert.assertEquals(result, Subject.VALUE);
}
或者我应该在测试类中维护一个单独的值并使用它?
private static final String SUBJECT_VALUE = "SUBJECT_VALUE";
@Test
public void testSubjectMethod() throws Exception {
Subject subject = new Subject()
String result = subject.subjectMethod();
Assert.assertEquals(result, SUBJECT_VALUE);
}
答:
2赞
Dave Schweisguth
4/20/2016
#1
是的,在测试中使用主题类常量,原因有二:
在整个测试中使用常量可确保,如果更改常量的值,则会在所有位置更改它。相反,如果在每个测试中复制该值,则可能只更新该值的一个匹配项,而不更新另一个值,这可能会导致未更新的测试在不应该通过时通过,然后会出现 bug。这种考虑实际上只要求你在整个测试中使用相同的常量,而不是在你的测试和主题类中是相同的常量,但如果你在主题类中有这个常量,你也可以在测试中使用它。
常量清楚地表明该值对程序及其使用方式很重要。命名常量,使其在测试中的角色(而不仅仅是它们在实现中的角色)清晰。在测试中使用它们会给命名带来积极压力。
然而
不要在测试中只使用任何类中的常量:主题类可能使用另一个类中的常量,并且你可能需要在主题类的测试中该常量的值。但是,如果没有其他理由在测试中引用其他类,请不要仅仅为了常量而这样做;这将不必要地将测试和实现结合起来。如果您不想引用的类具有不想复制的有意义的常量,请将其移动到您不介意引用的类(可能是测试的主题)或新的仅常量类,然后从那里使用它。
不要使用在测试中提供主题类行为的复杂部分的常量。这样做会使测试只是实现的副本,从而降低测试的功效。例如,在测试中使用主题类中使用的正则表达式常量可能是一个坏主意。相反,编写测试来显示该类使用正确的输入执行正确的操作,并且如果您重写该类以不使用正则表达式,这仍然会通过。
评论
1赞
mattalxndr
4/20/2016
我不明白“不要使用实现类中的常量,否则这些常量不会在测试中被引用”。你能试着换一种说法吗?
0赞
Dave Schweisguth
4/20/2016
修订。怎么样?
0赞
jaco0646
4/20/2016
修订似乎意味着,“在测试中遵循得墨忒耳定律”。
1赞
jaco0646
4/20/2016
您能否解释一下在测试中复制常量可能导致的错误类型?
0赞
Dave Schweisguth
4/20/2016
做。关于LoD,这已经非常接近了,尽管LoD非常具体地涉及两个类之间的关系。依赖反转原则是相关的:butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
评论