我正在寻找一种使用 MSTest 以编程方式创建单元测试的方法。我想遍历一系列配置数据并根据这些信息动态创建测试。配置数据在编译时不可用,可能来自外部数据源,例如数据库或 XML 文件。场景:将配置数据加载到测试工具中并循环访问数据,同时为每个元素创建新测试。希望每个动态创建的测试分别报告(成功/失败)。
1 回答
您可以根据数据的复杂程度使用数据驱动测试。如果您只是替换值并进行测试以确保您的代码可以处理相同的输入,这可能是可行的方法,但这听起来并不像您所追求的那样。(您可以使这更复杂,毕竟您所做的只是从数据源中提取值,然后根据它做出程序化决策)
所有 MS Test 真正做的是运行一系列测试,然后生成结果(在 xml 文件中),然后由调用应用程序解释。它只是执行您通过属性指定的方法的包装器。
听起来你在问的是动态编写 C# 代码,并让它在工具中执行。如果您真的想通过 MS 测试运行它,您可以:
- 构建一个查看 XML 文件的方法(或一系列方法)
- 写出 C# 代码(我可能会为此查看 T4 模板)(我个人会使用 F# 来执行此操作,但我更偏向于函数式语言,这对我来说会更容易)。
- 调用 csc.exe(C# 编译器)
- 调用 MS 测试
您也可以直接将 MSIL 代码写入正在运行的应用程序中,并尝试让 MS Test 执行它,这对某些人来说可能很有趣,但这可能很耗时并且不一定能保证工作(我没有尝试过,所以我不知道坑会是什么)。
基于此,快速构建您自己的工具包可能会更容易,该工具包将解释您的 XML 文件并动态构建您的测试场景并生成相同的结果文件。(毕竟重要的是结果,而不是你如何到达那里。)既然你说它在编译期间不可用,我猜你对在 VS 工作室窗口中查看结果不感兴趣。
实际上,就我个人而言,我不会使用 XML 作为您的领域特定语言 (DSL)。它的解析很容易,因为 .NET 已经为您做到了,但它限制了它如何定义您的方法如何运行。它是用来传达数据的,虽然从技术上讲,代码是一种数据形式,但它没有足够的表达力来用更正式的语言传达许多能力。不过,这只是我个人的看法,给猫剥皮的方法有很多。