如何忽略基于NUnit中另一个测试的测试?

Dan*_* T. 11 nunit unit-testing

我正在为数据库操作编写一些NUnit测试.显然,如果Add()失败,那么Get()也会失败.然而,它看起来既欺骗Add()Get()失败,因为看起来有两个问题而不是一个问题.

有没有办法为测试运行指定"顺序",因为如果第一次测试失败,则忽略以下测试?

在同一行中,有没有办法自己订购单元测试类?例如,我想在测试来自UI的往返数据之前首先运行我的基本数据库操作测试.

注意:这与测试相互依赖有点不同,更像是在运行一堆测试之前确保某些东西先工作.例如,如果您无法首先连接到数据库,那么运行大量数据库操作会浪费时间.

编辑:似乎有些人忽略了这一点.我不这样做:

[Test]
public void AddTest()
{
    db.Add(someData);
}

[Test]
public void GetTest()
{
    db.Get(someData);
    Assert.That(data was retrieved successfully);
}
Run Code Online (Sandbox Code Playgroud)

相反,我这样做:

[Test]
public void AddTest()
{
    db.Add(someData);
}

[Test]
public void GetTest()
{
    // need some way here to ensure that db.Add() can actually be performed successfully
    db.Add(someData);
    db.Get(somedata);
    Assert.That(data was retrieved successfully);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我想确保在我可以测试是否可以检索数据之前首先添加数据.人们假设我使用第一次测试的数据来通过第二次测试,但事实并非如此.我正在尝试确保在尝试依赖它的另一个操作之前可以执行一个操作.

正如我已经说过的,您需要确保在运行数据库操作之前可以连接到数据库.或者您可以在执行文件操作之前打开文件.或者在测试API调用之前连接到服务器.或者......你明白了.

Mic*_*mlk 14

NUnit支持Assume.That用于验证设置的" "语法.这是作为理论的一部分记录的(感谢clairestreb).在NUnit.Framework命名空间中是一个类Assume.引用文档:

/// Provides static methods to express the assumptions
/// that must be met for a test to give a meaningful
/// result. If an assumption is not met, the test
/// should produce an inconclusive result.
Run Code Online (Sandbox Code Playgroud)

所以在上下文中:

public void TestGet() {
    MyList sut = new MyList()
    Object expecting = new Object();
    sut.Put(expecting);
    Assume.That(sut.size(), Is(1));
    Assert.That(sut.Get(), Is(expecting));
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,是声明依赖关系的绝佳方式,而"不确定"恰恰是正确的结果,在大多数测试框架中最终结果为橙色:意思,还需要做些什么. (2认同)

Eri*_*fer 5

测试应该永远是互相依赖的.你刚刚发现了原因.根据定义,依赖于彼此的测试是脆弱的.如果您需要数据库中的数据进行测试Get(),请将其放在设置步骤中.

  • 这就是嘲弄和诅咒的目的.在"Get()"的测试中,您应该能够为Get()提供虚拟数据,以便在没有"Add()"的情况下运行测试.这可能意味着传入一个`Add()`的子类,它不会做任何可能导致它失败的事情.关键是单元测试应该只测试有问题的单元.有一种方法可以在不测试Add()的情况下测试Get().如果你得到了你要求的修复,你就不知道`Get()`是否有效,如果`Add()`被破坏了.这意味着您无法获得系统的可靠快照. (4认同)
  • @EricSchaefer:在谈到单元测试时,这一点(测试应该是独立的)是正确的。Nunit 还可以用于更高级别的测试,并且这些测试可以是依赖的。此外,当基本功能失败时,您很可能决定不运行一些复杂的测试,尤其是在测试驱动开发中。 (2认同)

Aar*_*lla -2

创建一个全局变量并在测试中返回,除非GetAdd其设置为 true(在 的最后一行执行此操作Add):

public boolean addFailed = false;
public void testAdd () {
    try {
        ... old test code ...
    } catch (Throwable t) { // Catch all errors
        addFailed = true;
        throw t; // Don't forget to rethrow
    }
}
public void testGet () {
    if (addFailed) return;
    ... old test code ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案危险地接近**错误**,因为它取决于运行的顺序;目前 nunit 根据测试名称运行,所以这没问题。但是,如果将来 Nunit 更改运行顺序,即“testGet”先于“testAdd”运行怎么办?在这种情况下,`testAdd` 将被运行,但 `testGet` 不会! (5认同)