保持单元测试独立和独立

时间:2013-09-29 00:18:51

标签: unit-testing

我无法让我的单元测试保持彼此独立。例如,我有一个带有两个append方法的链表,一个采用单个元素并将其追加到列表中,另一个采用另一个列表并附加整个事物;但是我无法测试第二个append方法(采用整个列表的方法)而不使用第一个append方法来填充我传入的列表。如何保持单元测试这两种方法是否相互分离?

2 个答案:

答案 0 :(得分:1)

您描述的情况在测试中无处不在:您有一些要测试的类或库。该类或库具有某些需要测试的方法/函数,而对于其中某些方法的测试,则必须调用同一库的其他方法/函数。

换句话说,当根据四个阶段的测试模式(设置,练习,评估,清理)分解测试时,您想在练习阶段中调用类/ lib。但是,似乎很烦人的是,您必须在设置阶段甚至可能在评估和/或清理阶段也要调用它的某些元素。

这是不可避免的:您提到在列表append函数的设置中,您必须使用单元素append函数。但是,更糟糕的是:您还必须使用列表类的构造函数-没有那个,就没有机会脱身。但是,构造函数也可能有问题……

肯定会发生的是,由于设置中调用的功能存在缺陷,测试失败(或错误通过)。但是,适当的测试套件(应该在评论中提到)也应该针对其他功能(称为低级功能)进行测试。

例如,您应该进行大量测试,检查类的构造函数是否正常工作。如果您在某个时候修改了构造函数,使其变得有缺陷,则在设置阶段使用该构造函数的所有测试将不再可信。但是,一些测试构造函数本身的测试(因此在执行阶段称为测试)应该现在失败。

然后,从测试结果的概述中,您将能够确定测试失败的根本原因。这需要对相关性有一些了解:从哪些意义上说,哪些测试专注于低级方面,哪些测试是较高级的。

有一些方法可以使这些依赖性更加明显,从而使以后更容易分析测试失败-但这些都不是必不可少的:

  • 在测试代码中,将用于较低级别方面的测试放在文件的顶部,而将更具依赖性的测试放在底部。然后,当几个测试失败时,首先查看最靠近文件顶部的测试。请注意,测试代码中的测试顺序不一定暗示执行顺序:例如,JUnit并不关心测试方法在测试类中的写入顺序。
  • 正如评论中所建议的那样,您可以另外配置测试框架以在其他测试之前运行较低级别的测试。

答案 1 :(得分:0)

您可以创建一个本身不是单元测试方法的方法,而是为多个测试创建条件,然后执行结果验证。您的实际单元测试方法将调用另一种方法。因此,您可以将相同的数据集用于多个测试,而不是在测试方法之间引入依赖关系。

我不知道您使用的是哪种语言,但这里是Xcode 5中使用新XCTest框架的Objective-C的示例。我会做这样的事情:

- (void)performTestWithArray:(NSArray *)list
{
    NSMutableArray *initialList = ...; // create the initial list you will use with multiple tests
    [initialList addObjectsFromArray:list];
    XCTAssertTrue(testCondition, @"message");
}

- (void)testAddSingleElement
{
    NSArray *array = @[ @"one element" ];
    [self performTestWithArray:array];
}

- (void)testAddList
{
    NSArray *array = @[ @"first element", @"second element", @"third element" ];
    [self performTestWithArray:array];
}