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)
测试应该永远是互相依赖的.你刚刚发现了原因.根据定义,依赖于彼此的测试是脆弱的.如果您需要数据库中的数据进行测试Get(),请将其放在设置步骤中.
Aar*_*lla -2
创建一个全局变量并在测试中返回,除非Get将Add其设置为 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)
| 归档时间: |
|
| 查看次数: |
2893 次 |
| 最近记录: |