1

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

4

2 回答 2

2

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

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

这是无法避免的:您提到在列表append函数的设置中必须使用单元素append函数。但是,更糟糕的是:您还必须使用列表类的构造函数——没有那个就没有机会逃脱。但是,构造函数也可能是错误的......

肯定会发生的是,测试失败(或错误地通过),因为设置中调用的函数有缺陷。然而,一个合适的测试套件应该(正如评论中提到的那样)也应该对其他(称为低级)功能进行测试。

例如,您应该进行一些测试来检查您的类的构造函数是否正常工作。如果在某个时候您修改了构造函数,使其变得有缺陷,那么在设置阶段使用构造函数的所有测试都不再可信。但是,一些测试构造函数本身(并因此在练习阶段调用它)的测试现在应该会失败。

从测试结果的概述中,您将能够确定测试失败的根本原因。这需要对依赖关系有所了解:哪些测试侧重于较低级别的方面,哪些是较高级别的,因为它们依赖于一些较低级别的功能才能工作。

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

  • 在测试代​​码中,您将较低级别方面的测试放在文件的顶部,将更多相关的测试放在底部。然后,当几个测试失败时,首先查看最接近文件顶部的测试。请注意,测试代码中的测试顺序并不一定意味着执行顺序:例如,JUnit 不关心测试方法在测试类中的编写顺序。
  • 正如评论中所建议的那样,您还可以配置测试框架以在其他测试之前运行较低级别的测试。
于 2018-11-22T12:15:30.417 回答
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];
}
于 2013-09-29T00:26:48.453 回答