一种新的单元测试的方法意味着什么?难道说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代码

1. @Test( expected = IllegalArgumentException.class )

  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.
 那么BDD够了吗?

  答案当然是NO。BDD是很强大,你可以试一下,但是如果你真正的用于实践,