如果找不到csv文件,则跳过单元测试

时间:2010-07-01 10:58:08

标签: c# unit-testing csv mbunit gallio

我有许多依赖于csv文件存在的单元测试。如果这个文件显然不存在,它们将抛出异常。

是否有任何Gallio / MbUnit方法可以有条件地跳过测试运行?我正在运行Gallio 3.1并使用CsvData属性

[Test]
[Timeout(1800)]
[CsvData(FilePath = TestDataFolderPath + "TestData.csv", HasHeader = true)]
public static void CalculateShortfallSingleLifeTest()
{
    .
    .
    .

由于

4 个答案:

答案 0 :(得分:7)

根据this question中的答案,如果文件丢失,您需要制作一个新TestDecoratorAttribute来调用Assert.Inconclusive

Assert.Inconclusive非常适合您的情况,因为您并不是说测试通过或失败;你只是说它无法在当前状态下执行。

答案 1 :(得分:4)

您在这里所拥有的不是单元测试。单元测试测试单个代码单元(虽然可能很大),但不依赖于外部环境因素,如文件或网络连接。

由于您依赖于此处的文件,因此您拥有的是集成测试。您正在测试您的代码是否安全地与代码控制之外的东西集成,在本例中是文件系统。

如果这确实是一个集成测试,你应该更改测试,以便测试你真正想要测试的东西。

如果您仍在考虑将其作为单元测试,例如您尝试测试CSV解析,那么我会重构代码,以便您可以模拟/存根/伪造实际读取CSV文件内容。这样,您可以更轻松地向CSV解析器提供测试数据,而不依赖于任何外部文件。

例如,你有没有考虑过:

  • AntiVirus程序包可能无法立即访问该文件
  • 典型的程序员工具,如TortoiseSvn,将shell覆盖集成到资源管理器中,有时会长时间保存文件,并不总是将文件访问程序(您删除了文件,并尝试覆盖它一个新的?当然,让我先完成删除,但有一个程序保留文件,所以可能需要一段时间...)
  • 该文件可能实际上并不存在(为什么会这样?)
  • 您可能没有路径的读取权限
  • 您可能有错误的文件内容(从早期的调试会话中剩余?)

一旦你开始涉及文件系统,网络连接等外部系统,就会出现很多问题,你所拥有的东西基本上都是一个脆弱的测试。

我的建议:找出你要测试的内容(文件系统?CSV解析器?),并删除与该目标冲突的依赖项。

答案 2 :(得分:2)

一种简单的方法是在测试开始时包含一个if条件,如果可以找到CSV文件,它将只执行测试中的任何代码。

当然,这有一个很大的缺点,即测试会是绿色的,尽管它们实际上并没有运行和断言。

我同意Grzenio,如果你的单元测试严重依赖外部条件,他们并没有真正帮助你。在这种情况下,您永远不会真正知道单元测试是成功运行还是刚刚跳过,这与单元测试的实际情况相矛盾。

在我个人看来,我只是编写测试,以便在文件不存在时它们正确失败。如果它们失败,则表明有问题的文件应该在运行单元测试的机器上可用。这可能需要一些手动调整(将文件送到相关的计算机或服务器),但至少你有可靠的单元测试。

答案 3 :(得分:1)

Gallio/MbUnit v3.2中,抽象ContentAttribute及其具体的派生类型(如[CsvData])有一个新的可选参数,允许在以下情况下更改测试的默认结果打开或读取文件数据源时出错(参考issue 681)。语法如下:

[Test]
[CsvData(..., OutcomeOnFileError = OutcomeOnFileError.Inconclusive)]
public void MyTestMethod()
{
  // ...
}