【IT168 技术文档】
一种新的单元测试的方法意味着什么?难道说Junit或者TestNG还不够好?Junit(这里我提及到它因为它简单,但是在我的讨论中,TestNG 也一样简单 from here on I’ll nominate it only for briefness,but TestNG is the same for my discussion)把测试类作为重点,并且所有的测试都是从那里开始。这意味着事实上,被测试类被认为仅仅存在于测试代码中,程序员只能通过它们使用的名字惯例来找到这些被测试类。
在旧版本的Junit中,你设计的测试类,需要强制继承Junit框架中的类,并且将调用的方法需要用"test"开头。因此按这个惯例来命名测试类和测试方法,并把他们与被测试的类和方法“连接”起来。我想你会同意,TestNG和Junit4给了我们更多的自由,去掉这些要求。不管怎样,被测试的类和方法和我们的测试类仍然是这样逻辑的联系在一起,并且很多测试类仍然遵循那些旧的惯例。
但是有很多更好的方式来命名类和方法!我来介绍BDD(Behaviour Driven Development),请注意BDD不是这篇文章的重点,但是它使我这篇文章更加完美。因此,让我们先用少许文字了解BDD吧。
BDD不仅是一个新的写测试的方法,也是一个按约定的新的设计形式
引用behaviour-driven.org来开始我的介绍:
BehaviourDrivenDevelopment grew out of a thought experiment based on NeuroLinguisticProgramming techniques. The idea is that the words you use influence the way you think about something
BDD产生自一个基于神经语言规划学技术的实验的想法。这个想法是你用的语言会影响你考虑问题的方式。
这个想法是需要程序员关注用来描述一个测试类或者方法的词语,因为所选的词语将影响到他们对这个问题的关注点。实际上,采用BDD方法写测试类时,相比这些被测试的类/方法本身,我们将更加关注这些被测试类/方法的行为。当然,这也将改变很多我们写测试代码的方式,比如,我们将对一个方法测试多次来验证每个行为是否正确。
OK, what if I don’t believe on Neuro Linguistic Programming(神经语言规划学)?是否我还不相信神经语言规划学。好的,从一个纯粹的开发者角度来看,我们根据我们的类和方法的行为作为约定来命名测试,因此,这个测试结果将是绝对清晰的(比如,
“shouldAcceptNullValue fails”就是一个清楚的表达,并不需要复杂的报告)。让我们提供一个简单的例子:
Java代码
2. public void shouldNotPermitMethodNull() throws Exception {
3. [..]
4. }
5. @Test( expected = IllegalArgumentException.class )
6. public void shouldNotPermitEndPointNull() throws Exception {
7. }
8. @Test
9. public void shouldInitWebParams() throws Exception {
10. }
11. @Test
12. public void getHoldersResultShouldReturnHolderForRightParameters() throws Exception {
13. }
14. @Test
15. public void getHoldersResultShouldIgnoreUnknowntParameters() throws Exception {
16. }
17. @Test
18. public void getHoldersResultShouldIgnoreINParameters() throws Exception {
19. }
20. @Test
21. public void shouldRuninvokeForOneWayMethod() throws Exception {
22. }
23. @Test
24. public void shouldRuninvokeForMethods() throws Exception {
25. }
26. @Test
27. public void shouldRuninvokeForMethodsApplyingMapping() throws Exception {
28. }
你需要一个简单的关于如何使用BDD成功应用到java上的介绍吗(最初的主意来自Ruby’s RSpec)?可以先看看excellent post.