我有一些初始化代码来使用我的API。初始化可能会失败,我想在NUnit测试中测试它。
初始化后,可以使用API。我也在测试API,但我的所有测试方法都将使用相同的常见初始化代码。
我最理想的是这种行为:
在[1]失败的所有情况下,所有其他测试也会失败。但有价值的信息是[1]失败了。这就是我最有可能找到问题的地方。如果其他测试可以标记出来会很好吗?或某事,表明他们没有按照他们所依赖的功能执行没有通过测试。
我知道测试不应该是脆弱的。但我无法解决这样一个事实,即初始化代码对于正确执行其他功能是必要的。
这是一个更普遍的问题,其中某些功能取决于其他功能。 “其他功能”通常用于通过根据它进行所有测试失败来提供任何实际价值。如果“其他功能”将单独测试会更好。
答案 0 :(得分:2)
好的,我会怎么做......
将公共初始化放入Setup方法,因为它需要进行所有测试。如果初始化引发错误,你会看到
如果这对你来说太隐晦了,你可以(虽然我不推荐)在同一个套件中添加一个好名字的空测试。如果该测试显示为绿色,则可以确保Setup / common init代码已成功。
[Test]
public void VerifySetup() {}
更新:看起来你有一个非常小众的要求。我不知道NUnit中的任何机制来指定这样的条件执行测试 - 例如仅当Test1通过时才运行Test2到10。
答案 1 :(得分:1)
我一直在与NUnit开发人员联系。如果不编写一个非常复杂的插件,目前是不可能的。该功能将在3.x代码库中的某处出现,但不会出现在2.5中。我会考虑写它,但不是暂时的。
答案 2 :(得分:0)
试试这个:
将“初始化测试”定义为TestCase
将所有其他测试作为此TestCase的子类
创建一个以特定顺序运行测试的套件,以便首先进行“初始化测试”。
答案 3 :(得分:-1)
我认为这很明显。问题是你很难分离出你的API职责。你有两个。初始化API和API执行。编写测试以获得这种依赖可能会让你失望。
所以我建议API创建一个初始化对象,然后创建各种命令对象来执行API。命令对象将在某种商店中,或者您可以动态创建。
API将使用模拟的初始化对象,它将使用模拟的命令对象。
初始化对象实际上没有任何依赖关系,除了你需要初始化的任何内容。
Command对象需要一个模拟的初始化对象。
<强> [编辑] 强>
如果初始化测试失败,有两种方法可以使其他测试失败
将一个私有变量添加到测试用例中。 private isInitialized = false;
。然后你的所有其他测试检查这个变量的状态,如果不是真的那么失败。
使用API类扩展您的测试用例。添加询问初始化状态的私有函数。
两者的清洁工是2.最快的实施是1.
恕我直言当您必须以这种方式结合您的测试时,这可能是代码味道。如果你说它是一个集成测试。为什么要进行单独的初始化测试。集成更像是针对您的API运行某些操作。因此,每个集成测试必须初始化API。
您可能想重新考虑级联故障情况。完成测试可能会产生太大的噪音。
<强> [EDIT1a] 强>
我能看到满足您要求的唯一方法是extend NUnit。具体来看测试用例构建器和测试装饰器。
链接日期为2008年3月,所以希望它不会过时。