Unit testing 命令行中的Xamarin单元测试

Unit testing 命令行中的Xamarin单元测试,unit-testing,xamarin,xamarin.ios,xamarin.android,continuous-integration,Unit Testing,Xamarin,Xamarin.ios,Xamarin.android,Continuous Integration,我来自本地的iOS/Android开发背景,我试图理解使用命令行进行Xamarin单元测试的工具 在我看来,有两种类型的代码需要进行单元测试: 简单的旧C#代码-不依赖于任何iOS/Android框架-因此它不需要在iOS/Android模拟器上运行 依赖于需要在设备/模拟器上运行的iOS/Android框架的代码 这位官员提到了NUnitLite/Touch.Unit,但没有提到对命令行的任何支持。我确实找到了一个工具,但我不清楚这是否是一个由Xamarin正式支持的工具。此外,您似乎只能

我来自本地的iOS/Android开发背景,我试图理解使用命令行进行Xamarin单元测试的工具

在我看来,有两种类型的代码需要进行单元测试:

  • 简单的旧C#代码-不依赖于任何iOS/Android框架-因此它不需要在iOS/Android模拟器上运行
  • 依赖于需要在设备/模拟器上运行的iOS/Android框架的代码
这位官员提到了NUnitLite/Touch.Unit,但没有提到对命令行的任何支持。我确实找到了一个工具,但我不清楚这是否是一个由Xamarin正式支持的工具。此外,您似乎只能使用该工具在模拟器/设备上运行测试

我发现的另一个例子是——似乎你也可以在没有模拟器/设备的情况下运行测试,你也可以在模拟器/设备上运行测试——但是在那篇特定的博客文章中没有记录你是如何做到这一点的

所以我的问题是:我应该如何进行Xamarin单元测试,以及您建议使用哪些工具,以便在CI中获得命令行支持


感谢您在Xamarin上进行单元测试

在单元测试移动项目方面没有丰富的经验,但如果您想测试应用程序,我建议您采用以下集成测试方法:

1) 对于任何计算类型的功能(您称之为“纯旧C#”)都可以使用NUnit(它受mono支持)。 然而,我不能给出这样的代码示例,因为繁重的计算应该在服务器端完成。在这里,您可以进行单独的单元测试

2) (再次NUnit)可以用来证明应用程序工作正常,用户界面交互调用所需的行为。 Xamarin还提供TestCloud,该应用程序可以在许多设备上进行测试,但它是付费的。作为替代方案,您可以设置像Jenkins这样的构建服务器来为您完成这项工作


无论如何,这是我对如何做到这一点的看法,希望它能回答您的问题。

与Xamarin一起使用的最流行的单元测试框架是NUnit和XUnit。它们都类似于JUnit

  • 通常,Xamarin跨平台应用程序使用可移植类库(PCL)项目,其中包含平台无关(共享)代码:业务逻辑、模型、视图模型、服务等。该代码在单独的PCL或.net45测试项目中进行单元测试,该项目引用源项目和nunit/xunit 要运行/单元测试,您需要运行相应的测试运行程序,并将其指向测试程序集。nunit和xundit都具有控制台运行程序,可以从命令行任意参数化这些运行程序(请参阅链接)

    您可以随意选择nunit或xunit。我两个都喜欢

  • 您还可能有特定于平台的单元测试(取决于android/ios/uwp SDK),并且必须在设备上运行。这些测试也可以使用nunit或xunit创建,并使用或运行。基本上,这里要做的是添加一个android/ios应用程序项目进行测试,该项目引用nunit/junit,包含特定于设备的测试和指向共享测试的链接,并且可以在设备上运行它们

  • 还有一层编码的UI测试,NUnit、Xamarin UITest和Specflow可能在其中使用。我猜这部分超出了你的问题范围

  • 但是,你又一次从安卓系统过来,与gradle一起使用。Xamarin和.net没有gradle,但它有。我用它来自动化我所有的项目构建/测试/ci/部署等

    Cake(C#Make)是一个跨平台的构建自动化系统,它使用C#DSL完成编译代码、复制文件/文件夹、运行单元测试、压缩文件和构建NuGet包等任务

    您的蛋糕脚本可以如下所示:

    Task("Run-Unit-Tests")
     .IsDependentOn("Build")
     .Does(() =>
     {
         NUnit("./src/**/bin/" + configuration + "/*.Tests.dll");
     });
    
     Task("Build")
      .Does(() =>
        {
           DotNetBuild("YourAndroid.csproj");
           DotNetBuild("YourCoreTests.csproj");
             ...
        }
      );
    
    Cake附带一个引导程序文件(ps1-powershell for windows或sh for mac),该文件下载运行脚本所需的所有工具(Cake本身、nuget、nunit/xunit runner等)

    您的命令行/CI可以这样运行:

    ./build.sh -Target Run-Unit-Tests
    

    感谢您的深入回答,它提供了我想要的所有信息(加上一个与蛋糕脚本相关的额外信息,非常好)。是否也有方法收集代码覆盖率数据?对于代码覆盖率,我使用的是。不幸的是,它没有mono支持,所以我定义了一个jenkins作业/管道步骤,该步骤仅限于windows构建从属。还有,但我从来没有用过。