【问题标题】:Unit Testing a Customer's Installation (with NUnit and MSTest)对客户的安装进行单元测试(使用 NUnit 和 MSTest)
【发布时间】:2009-10-06 00:52:27
【问题描述】:

我已为我公司的应用程序开发了大量单元测试,开发人员希望将我的单元测试交给我们的支持部门,以帮助他们调试客户安装问题。我使用 mstest 编写了我的单元测试,因此如果客户想要立即使用我的测试,支持人员必须在客户的机器上安装 Visual Studio,这显然是错误的做法。我研究过在命令提示符下使用不带 VS 的 mstest,但破解客户系统上的注册表以使其认为已安装 VS 也不可行。

为了解决这个问题,我计划使用 this post 中的信息为 nunit 编译我的 mstest。但是,在启用 NUnit 进行编译并将我的测试程序集 dll 添加到 NUnit 运行程序后,我收到错误消息“此程序集不是使用任何已知框架构建的。”

有没有人这样做并且有提示/技巧来让它运行?或者这是解决这个问题的完全错误的方法?谢谢。

【问题讨论】:

  • 对我来说,这似乎是一个可行的“解决方案”:提取所有单元测试的核心/内容,将它们放在单独的类库解决方案中,以便能够分发它。当然,您必须将 Assert.Functions 从类库解决方案中分离出来。从单元测试代码或外部测试工具调用外部化函数。因此类库成为核心,MSTest 框架或您自己的外部测试工具成为“GUI”包装器。这当然需要一些重构/重写,但实际测试保持不变,不是吗?

标签: c# nunit mstest


【解决方案1】:

我会同意你对“或者这是解决这个问题的完全错误的方法”的第二个想法。

为了轻松解决这个问题并且不让您的支持部门感到困惑,我建议围绕测试类创建一个小命令行包装器。您可以自己编写命令行工具,或者如果您愿意,可以执行以下操作:

using CSharpTest.Net.Commands;
static void Main(string[] args)
{
    MyTest testClass = new MyTest();
    // optional: testClass.MySetupMethod();
    new CommandInterpreter(testClass).Run(args);
}

只需在引用您的测试程序集和 CSharpTest.Net.Libary.dll 的新项目中将上述代码构建为命令行 exe。命名空间 CSharpTest.Net.Commands 在 CSharpTest.Net.Libary.dll 程序集 from this download 中定义。

基本上,上面的代码将爬取您的测试类(在上面的示例中名为 MyTest),并将所有公共方法公开为可以通过命令行执行的命令。默认情况下,它提供帮助输出并在失败时设置 Environment.ExitCode。如果你想变得花哨,你可以用以下任何一种来装饰你的测试:

public class MyTest
{
    [System.ComponentModel.DisplayName("rename-this-function")]
    [System.ComponentModel.Description("Some description for tech-support")]
    [System.ComponentModel.Browsable(true | false)]
    public void TestSomeFunction()
    { ... }
}

(是的,我承认我在无耻地插入自己的代码:)

【讨论】:

  • 有趣。从昨天开始,我已经对此有所了解,创建了一个小型控制台应用程序,该应用程序使用反射来调用我的类中的测试方法,但遇到了 TestContext 和类初始化方法的问题。看起来您在每次测试运行时都自己构建了初始化程序?
  • 啊,不,我忘记了 MsTest 奇怪的初始化依赖项。我认为他们这样做是故意强迫你继续使用 MsTest :) 无论如何,你能打破你对 MsTest 特定东西的依赖吗?如果没有,我将不得不撤回我最初的建议,并建议您在测试之外编写一个命令行实用程序。只需使其在构建中与测试并行保持自动化,以确保它继续工作。
  • 这是我最终使用的最接近的答案 - 这只是我在 NUnit 上运行的代码的另一个版本,带有一部分测试。
【解决方案2】:

我担心有人会添加一个单元测试(或伪装成单元测试的集成测试),您会无意中针对您的客户数据库运行该测试。当然,我假设你有一个数据库,但这似乎是一种冒险的方法,除非你能确定你的测试在现在和将来都是非破坏性的。

您是否已登录您的应用程序?这是帮助支持的传统方式,有many tools 可以帮助您。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多