2009-07-01 102 views
3

想象我有一个方法:如何区分单元测试方法?

void Method(bool parameter){ 
    if(parameter){ 
     // first case 
    } else { 
     // second case 
    } 
} 

你首选的单元测试组织方法?

选项1:

void MethodTest(){ 
    // test first case 
    // test second case 
} 

选项2:

void MethodTestFirstCase(){ 
    // test first case 
} 

void MethodTestSecondCase(){ 
    // test second case 
} 

回答

6

在这种情况下,我会分别测试两个。

话虽如此,我并不是教条主义的“每测试只测试一件事”的方法。有时候,在同一个测试中测试多个事物会更具实际意义 - 特别是如果达到一个终点意味着要经过另一个点,那么将两者结合起来有时可以。

在这种情况下,你真的会测试两个单独的事情,而不是一个到另一个的路上,所以我会分裂他们。

+3

+1为“一个在另一个的路上”。这通常是在单个测试中进行多重检查的理由。 – 2009-07-01 20:11:01

4

选项2

你应该在每次试验测试的只有一件事。如果测试不止一件事情,那么给测试一个好名字也很困难。

当测试失败时,应该很容易找到错误,而不使用调试器。如果测试涵盖多个事件,那么错误可能是多个地方。

3

选项2通常是优选的。

在单元测试运行器中,您可以分别获得每个测试的可见性,而不必在发生错误时查看发生故障的位置。

此外,随着您的发展,更容易运行更专注的测试以更快地获得反馈。

0

我会有一个测试类(套件),测试所测试的类中的所有不同方法。此类(套件)对于特定功能的每个变体都会有不同的测试方法。这并不意味着您必须在方法的每行代码中进行一次测试。您可以根据单一方法决定“特征”的粒度,但通常很小。在你的情况下,我会说你有两个“功能”,一个是参数通过测试时,另一个是失败。因此,对于这种方法,我至少要进行两次测试。通常,每个测试用例只有一个或者几个断言。

2

对于选项1,如果第一种情况失败,则根本不会测试第二种情况。对于选项2(在大多数单元测试框架中),如果第一种情况失败,则第二种情况仍将被测试。

这使得选项2更胜一筹,因为您可以区分只有第一种情况被打破的情况和两种情况都被打破的情况,这使得在事情出错时更易于调试。

1

我倾向于使用方案3:

[TestClass] 
public class When_parameter_is_a { 
    setup() {} // arrange 
    execute() {} // act 
    [TestMethod] 
    this_should_happen() {} // assert 
    [TestMethod] 
    this_should_happen_too() {} //assert 
} 

[TestClass] 
public class When_parameter_is_b { 
    setup() {} 
    execute() {} 
    [TestMethod] 
    this_should_happen() {} 
    [TestMethod] 
    this_should_happen_too() {} 
} 

然后测试所有的预期行为的每一个部分。这是一种BDD风格(行为驱动设计)测试,强调在某些情况下的行为,而不是测试方法的“实施”。

+0

+1用于BDD和MSTest – 2009-07-01 20:27:41

1

也没有。

不要考虑测试类的方法,而是考虑测试类的作用 - 它提供给其他对象的服务。当你这样做时,你会发现你没有以被测试的类的方法命名的测试方法。而且,当多个测试执行与被测试的类相同的方法时,您不会遇到为测试找到名称的问题。