将参数传递给dotnet测试项目?

Mat*_*mas 8 c# integration-testing automated-tests .net-core

我在Visual Studio 2017中的.Net Core 1.1单元测试项目(不是xUnit测试项目)中有以下测试类.如何将命令行参数传递给TestMethod

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
        var args = Environment.GetCommandLineArgs();
        var json = JsonConvert.SerializeObject(args);
        throw new Exception(json);
    }
}
Run Code Online (Sandbox Code Playgroud)

互联网上的很多地方听起来好像你可以把--你想要传递的参数放在前面,但我无法让它发挥作用.

这些是我尝试过的命令:

  • dotnet test TestProject.csproj -- hello=world
  • dotnet test TestProject.csproj -- --hello world
  • dotnet test TestProject.csproj -- -hello world

但是他们每次都输出这个消息.注意既不存在hello也不world存在:

[ "C:\用户\ ____ \的NuGet \包\ microsoft.testplatform.testhost\15.0.0\lib中\netstandard1.5\testhost.dll", " - 端口", "55032", " - parentprocessid" "24440"]

第一个字符串只是正在运行的程序集的名称 - 第一个命令行参数的标准.我不知道这些--port--parentprocessid论据的来源.

此外,这些变化使得dotnet test扼流圈One or more runsettings provided contain invalid token(原文如此):

  • dotnet test TestProject.csproj -- -hello=world
  • dotnet test TestProject.csproj -- --hello=world

编辑:它看起来GetCommandLineArgs() 不是一个伟大的选项,即使它确实在这里工作.

另外,2006年来自social.msdn.microsoft.com的这个问题的答案是:

实例化这些类的方式,以便VS可以对它们进行单元测试,这与正常执行完全不同.可执行文件不像普通的那样运行,你和VS都不能为它提供参数.通过将二进制文件用作类库,可以在程序执行的情况下实例化类.(原文如此)

我想知道这仍然适用于dotnet test

在其他消息中,SO上的这个人怀疑命令行参数是否可以传递给DLL,但他错了:

[<entrypoint>函数的原型:] void CALLBACK EntryPoint(HWND hwnd,HINSTANCE hinst,LPSTR lpszCmdLine,int nCmdShow);

[Rundll]调用<entrypoint>函数,传递命令行tail,即<optional arguments>.

Mat*_*mas 0

我想我对这一切的看法都是错误的。将以下两件事结合起来可能是最好的方法。

选项 1:从集成测试重构为单元测试

TestMethod现在是集成测试,而不是单元测试,因为它取决于命令行参数。

如果我重构,TestMethod以便它从这样的接口获取命令行参数:

interface IArgumentsProvider
{
    IEnumerable<string> GetArguments();
}
Run Code Online (Sandbox Code Playgroud)

...然后这会转换TestMethod为单元测试,IArgumentsProvider可以在其中进行模拟,以便只有其中的功能TestMethod测试其中的功能(这就是单元测试的定义)。

请注意,我可能希望将该接口的非模拟实现上的测试移至其他集成测试所在的位置。见下文。

选项 2:将集成测试从单元测试项目移至部署管道中的其他位置

将测试重构为单元测试并不总是可能的。例如,在某些时候,您需要保证位置控制器在将代码发布到野外之前实际上可以从 SQL 数据库发布和检索地理坐标。

这是集成测试的一个示例。集成测试属于部署管道中的其他位置:不要将测试作为单元测试项目中构建定义的一部分执行,而是将其移至发布定义中并从更合适的框架中调用它。

  • 无论 .net 项目是否正确使用(这是您的观点),事实仍然是许多人使用它们来执行集成测试。问题仍然存在,如何通过命令行将数据传递到 dotnet 测试项目中? (3认同)