Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果未找到csv文件,则跳过单元测试_C#_Unit Testing_Csv_Mbunit_Gallio - Fatal编程技术网

C# 如果未找到csv文件,则跳过单元测试

C# 如果未找到csv文件,则跳过单元测试,c#,unit-testing,csv,mbunit,gallio,C#,Unit Testing,Csv,Mbunit,Gallio,我有许多依赖csv文件的单元测试。如果该文件显然不存在,他们将抛出异常 是否有任何Gallio/MbUnit方法可以有条件地从运行中跳过测试?我正在运行Gallio3.1并使用CsvData属性 [Test] [Timeout(1800)] [CsvData(FilePath = TestDataFolderPath + "TestData.csv", HasHeader = true)] public static void CalculateShortfallSingleLifeTest()

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

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

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

谢谢

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

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

不过,我同意Grzenio的观点,如果你的单元测试严重依赖于外部条件,那么它们并不能真正帮助你。在这个场景中,您永远不会真正知道单元测试是成功运行还是被跳过,这与单元测试的实际用途相矛盾


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

根据中的答案,您需要创建一个新的
TestDecoratorAttribute
,调用
Assert.Inconclusive
,如果文件丢失


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

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

因为您在这里依赖于一个文件,所以您有一个集成测试。您正在测试您的代码是否安全地与代码控制之外的内容集成,在本例中,是文件系统

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

如果您仍将此视为一个单元测试,例如,您正在尝试测试CSV解析,那么我将重构代码,以便您可以模拟/存根/伪造CSV文件内容的实际读取。通过这种方式,您可以更轻松地向CSV解析器提供测试数据,而不依赖于任何外部文件

例如,您是否考虑过:

  • 防病毒软件包可能不允许您立即访问该文件
  • 一个典型的程序员工具,如OrtoiseSVN,将shell覆盖层集成到Explorer中,有时会将文件保存太长时间,并且并不总是允许程序访问文件(您删除了该文件,并试图用新文件覆盖它?当然,让我先完成删除,但有一个程序保留该文件,因此可能需要一段时间…)
  • 文件可能不在那里(为什么?)
  • 您可能没有对该路径的读取权限
  • 您可能有错误的文件内容(以前调试会话的遗留内容?)
一旦开始涉及文件系统、网络连接等外部系统,就会出现很多问题,基本上就是一个脆弱的测试

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

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

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

删除这些测试?如果可以无声地“跳过”它们,那么让它们有什么意义如果某个文件丢失了?这里的不是单元测试,而是集成测试。两者之间的区别在于测试成功与否并不取决于被测试的实际代码,而是取决于外部环境因素。您是否无法模拟csv文件的读取,或者您是否实际测试了文件的大小系统?此测试是另一个单元测试的副本,但它使用csv文件向测试中提供数千行数据。这就是为什么如果有人意外移动/删除文件,我不希望代码停止发布。您不能将数据放在测试项目的资源中,而不是作为单独的物理文件重新发布吗公元