我无法让我的单元测试保持彼此独立。例如,我有一个带有两个append
方法的链表,一个采用单个元素并将其追加到列表中,另一个采用另一个列表并附加整个事物;但是我无法测试第二个append
方法(采用整个列表的方法)而不使用第一个append
方法来填充我传入的列表。如何保持单元测试这两种方法是否相互分离?
答案 0 :(得分:1)
您描述的情况在测试中无处不在:您有一些要测试的类或库。该类或库具有某些需要测试的方法/函数,而对于其中某些方法的测试,则必须调用同一库的其他方法/函数。
换句话说,当根据四个阶段的测试模式(设置,练习,评估,清理)分解测试时,您想在练习阶段中调用类/ lib。但是,似乎很烦人的是,您必须在设置阶段甚至可能在评估和/或清理阶段也要调用它的某些元素。
这是不可避免的:您提到在列表append
函数的设置中,您必须使用单元素append
函数。但是,更糟糕的是:您还必须使用列表类的构造函数-没有那个,就没有机会脱身。但是,构造函数也可能有问题……
肯定会发生的是,由于设置中调用的功能存在缺陷,测试失败(或错误通过)。但是,适当的测试套件(应该在评论中提到)也应该针对其他功能(称为低级功能)进行测试。
例如,您应该进行大量测试,检查类的构造函数是否正常工作。如果您在某个时候修改了构造函数,使其变得有缺陷,则在设置阶段使用该构造函数的所有测试将不再可信。但是,一些测试构造函数本身的测试(因此在执行阶段称为测试)应该现在失败。
然后,从测试结果的概述中,您将能够确定测试失败的根本原因。这需要对相关性有一些了解:从哪些意义上说,哪些测试专注于低级方面,哪些测试是较高级的。
有一些方法可以使这些依赖性更加明显,从而使以后更容易分析测试失败-但这些都不是必不可少的:
答案 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];
}