C# 如果未找到csv文件,则跳过单元测试
我有许多依赖csv文件的单元测试。如果该文件显然不存在,他们将抛出异常 是否有任何Gallio/MbUnit方法可以有条件地从运行中跳过测试?我正在运行Gallio3.1并使用CsvData属性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()
[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中,有时会将文件保存太长时间,并且并不总是允许程序访问文件(您删除了该文件,并试图用新文件覆盖它?当然,让我先完成删除,但有一个程序保留该文件,因此可能需要一段时间…)
- 文件可能不在那里(为什么?)
- 您可能没有对该路径的读取权限
- 您可能有错误的文件内容(以前调试会话的遗留内容?)
ContentAttribute
及其具体派生类型(如[CsvData]
有一个新的可选参数,允许在打开或读取文件数据源(参考)时发生错误时更改测试的默认结果。语法如下:
[Test]
[CsvData(..., OutcomeOnFileError = OutcomeOnFileError.Inconclusive)]
public void MyTestMethod()
{
// ...
}
删除这些测试?如果可以无声地“跳过”它们,那么让它们有什么意义如果某个文件丢失了?这里的不是单元测试,而是集成测试。两者之间的区别在于测试成功与否并不取决于被测试的实际代码,而是取决于外部环境因素。您是否无法模拟csv文件的读取,或者您是否实际测试了文件的大小系统?此测试是另一个单元测试的副本,但它使用csv文件向测试中提供数千行数据。这就是为什么如果有人意外移动/删除文件,我不希望代码停止发布。您不能将数据放在测试项目的资源中,而不是作为单独的物理文件重新发布吗公元