使用NUnit和MSTest对客户安装进行单元测试

3
我已经为公司的应用程序开发了大量的单元测试,并且开发人员希望将我的单元测试交给我们的支持部门,以帮助他们调试客户安装问题。我使用mstest编写了我的单元测试,因此如果他们想要直接使用我的测试,支持部门必须在客户机上安装Visual Studio,这显然是错误的做法。我已经研究过在命令提示符下使用mstest而不需要VS,但是在客户机上修改注册表让它认为VS已经安装并不可行。
为了解决这个问题,我计划使用此帖子中的信息将我的mstests编译为nunit。然而,在启用NUnit后编译并将我的测试程序集dll添加到NUnit运行器中后,我收到了错误消息“此程序集未使用任何已知框架构建”。
是否有人已经做过这个并有技巧来实现?或者这完全是解决这个问题的错误方式?谢谢。

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

1

我会选择你的第二个想法,即“或者这完全是解决这个问题的错误方式”。

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

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

只需在新项目中将上述代码构建为命令行 exe,引用您的测试程序集和 CSharpTest.Net.Libary.dll。 命名空间 CSharpTest.Net.Commands 在 CSharpTest.Net.Libary.dll 中定义,可以从此下载链接获取。

基本上,上面的代码将遍历您的测试类(在上面的示例中命名为 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和类初始化方法方面遇到了问题。看起来你需要为每次测试运行构建自己的初始化器? - Case
1
啊,我忘记了MsTest的奇怪初始化依赖关系。我认为他们是故意这样做的,以迫使你继续使用MsTest :) 无论如何,你能否打破对MsTest特定内容的依赖?如果不能,我将不得不撤回我的原始建议,并建议你编写一个与测试分开的命令行实用程序。只需在构建中自动化并与测试并行运行,以确保它继续正常工作。 - csharptest.net
这是最接近我最终采用的答案 - 它只是我的另一个版本的代码,可以在NUnit上运行一部分测试。 - Case

1

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

你的应用程序中是否有日志记录?那是帮助支持的传统方式,有许多工具可以帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接