C# 单元测试设计问题 : How to reduce redundancy in unit test writing?

标签 c# .net unit-testing nunit

这是我的 C# 单元测试设计问题:

我有一个测试,我想在一些修改文件的代码上运行。我的测试将运行修改文件的代码,然后检查结果。到目前为止非常简单......

问题是,我有大约 10 个文件(很快就会更多)要针对它们运行相同的单元测试。当测试本身确实相同时,我不想为每个文件编写新的单元测试。

我可以编写一个测试来查询文件夹中的文件,然后对每个文件运行测试逻辑,但使用这种方法只会报告整组文件的一个通过/失败结果。

我想创建某种动态系统,我放置在特定文件夹中的每个文件都会通过相同的单元测试运行。因此,如果文件夹中有 25 个文件,测试将运行 25 次,并且单元测试结果报告运行了 25 次测试,并包括每个测试的单独通过/失败。

关于如何或是否可以在 C# 单元测试中完成的任何想法?或者使用 nunit 测试?

谢谢!我希望这不是一个重复的问题。我环顾四周,但我找不到任何东西。

最佳答案

听起来您需要的是参数化测试用例:请参阅 http://www.nunit.org/index.php?p=testCaseSource&r=2.5 .

所以:

[TestFixture]
public class Tests
{
    static string[] FileNames = new string[] 
                    { "mary.txt", "mungo.txt", "midge.txt" };

    [Test, TestCaseSource("FileNames")]
    public void TestMethod(string fileName)
    {
        Assert.That(File.Exists(fileName));
    }
}

[TestCaseSource] 属性告诉 NUnit 从字符串数组中获取字符串参数的值。

但是,该方法需要文件名的静态 常量。如果您更愿意使用从数据库等读取文件的编程方法,请尝试像这样的工厂类:

[TestFixture]
public class Tests
{
    [Test, TestCaseSource(typeof(FilenameFactory), "FileNames")]
    public bool FileCheck(string fileName)
    {
        return File.Exists(fileName);
    }
}

public class FilenameFactory
{
    public static IEnumerable FileNames
    {
        get
        {
            foreach (var filename in 
                   Directory.EnumerateFiles(Environment.CurrentDirectory))
            {
                yield return new TestCaseData(filename).Returns(true);
            }
        }
    }
}

TestCaseData 类生成“测试用例”,其期望值可以通过流畅的界面设置。

关于C# 单元测试设计问题 : How to reduce redundancy in unit test writing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763508/

相关文章:

c# - 构建成功但发布失败——此版本的Microsoft.AspNetCore.All只兼容netcoreapp2.2目标框架

java - C# 和 Java 规范在有符号整数溢出时是否阐明了相同的行为?

c# - 如何在 XPS 文档中设置权限?

c# - 序列包含多个元素?

java - HTTP 请求 : ';' character in the request URL

c# - 模拟 DbSet<T> 内联

c# - VB.NET 中是否有锁定语句?

c# - 是否可以将 Assembly.ReflectionOnlyLoad 与发布者策略/程序集版本控制一起使用?

java - Java 的免费/开源测试生成器?

python - 在 python 单元测试运行时重置全局变量