【问题标题】:Is there an API for running Visual Studio Unit Tests programmatically?是否有用于以编程方式运行 Visual Studio 单元测试的 API?
【发布时间】:2011-01-04 12:41:17
【问题描述】:

是否有用于以编程方式运行 Visual Studio 单元测试的 API?

使用 Process.Start() 运行 MSTests.exe 在当前方案中不起作用。我正在寻找类似 NUnit SimpleTestRunner 的东西。

有什么想法吗?

/埃里克

【问题讨论】:

标签: visual-studio unit-testing mstest


【解决方案1】:

您可以使用 Microsoft REST API's for TFS 来运行 ms 测试。请参阅文档here

我已链接到“调用 Rest API”,以便您了解如何为 TFS 调用 REST API 之一。

请注意,如果您的测试链接到构建,它们应该在每次构建排队时自动运行。

这是Run Functional Tests的链接。

我还发现了一篇关于使用 TFS SDK API 运行测试的文章。这里也是那个链接:Link to API Article

【讨论】:

    【解决方案2】:

    你说得对,mstest 框架没有公共 API。有一天我为 mstest 写了一个手动替换,看看它有多难,而且它并不像看起来那么简单(特别是如果你想利用多个 CPU 内核),所以要小心走这条路。

    就我个人而言,我一直只是以编程方式运行mstest.exe,然后解析生成的.trx XML 文件。有什么特殊原因不能使用Process.Start 运行它吗?

    附:如果您传递/noisolation 命令行参数,mstest.exe 的一些奇怪行为就会得到解决 - 如果您愿意,请尝试一下 :-)


    更新:Erik 提到他想在当前线程中运行测试 API,以便为全球化问题设置线程文化。

    如果您在调试器下运行单元测试,您会注意到 mstest 创建了一堆线程,并在不同的线程中运行您的所有测试,因此即使您可以访问 API,这也不太可能工作。

    我建议这样做:

    1. 从您的测试“运行器”应用程序中,设置一个环境变量
    2. 运行 mstest 并将其指向特定测试
    3. 添加一个[ClassInitialize](或[TestInitialize])方法,该方法读取此环境变量并设置区域性
    4. 利润!

    【讨论】:

    • 我需要在当前线程中运行 mstest 以便我可以设置运行测试的区域性。我们有一些文化敏感的代码,我们想在多种文化下运行。 /noisolation 解决了什么奇怪的行为?
    • 如果你不设置 /noisolation,mstest 会创建一大堆额外的线程和 appdomains 之类的东西。这会导致 ncover 和 partcover 等代码覆盖工具失败。
    • 感谢您的信息!对您使用的工具有更深入的了解总是很高兴。您对文化事物的解决方案或多或少是我们最终实现的,因为我们无法让它在当前线程中运行。不过,最好不必依赖外部信号机制。
    【解决方案3】:

    在使用反射器深入研究 MSTest.exe 并进一步深入 Visual Studio 单元测试堆栈后,我发现 MSTest 使用的 API 被密封并设为私有,因此我无法从外部使用。

    【讨论】:

      【解决方案4】:

      为什么不使用 Reflector,看看 NUnit SimpleTestRunner 是如何运行测试的……然后使用这种技术……

      【讨论】:

      • 使用 Reflector 进行挖掘是个好主意。但是,NUnit SimpleTestRunner 使用任何人都可以使用的 NUnit 测试运行器 API。问题是VSTest好像没有对应的API。
      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多