在测试类中,在断言中使用主题类的常量是个好主意吗?[关闭]

Is it a good idea in a test class to use constants of the subject class in assertions? [closed]

提问人:mattalxndr 提问时间:4/20/2016 最后编辑:Dave Schweisguthmattalxndr 更新时间:4/23/2016 访问量:1789

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

7年前关闭。

在断言中使用主题类的常量是否被认为是不好的做法?

@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);
}
单元 测试 与语言无关 的常量

评论

0赞 4/20/2016
除了明显违反 DRY 的复制和创建微妙错误的雷区之外,您认为像这样复制数据会完成什么。

答:

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