zoukankan      html  css  js  c++  java
  • 使用 dotnet test 和 xUnit 在 .NET Core 中进行 C# 单元测试

    创建解决方案

    在本部分中,将创建包含源和测试项目的解决方案。 已完成的解决方案具有以下目录结构:

     
    /unit-testing-using-dotnet-test
        unit-testing-using-dotnet-test.sln
        /PrimeService
            PrimeService.cs
            PrimeService.csproj
        /PrimeService.Tests
            PrimeService_IsPrimeShould.cs
            PrimeServiceTests.csproj
    

    以下说明提供了创建测试解决方案的步骤。 有关通过一个步骤创建测试解决方案的说明,请参阅用于创建测试解决方案的命令

    • 打开 shell 窗口。

    • 运行下面的命令:

      .NET Core CLI
    • using System;
      
      namespace Prime.Services
      {
          public class PrimeService
          {
              public bool IsPrime(int candidate)
              {
                  throw new NotImplementedException("Not implemented.");
              }
          }
      }
      
    • 前面的代码:

    • 在 unit-testing-using-dotnet-test 目录下运行以下命令,向解决方案添加类库项目:

      .NET Core CLI
    • dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj  
      

    用于创建解决方案的命令

    本部分汇总了上一部分中的所有命令。 如果已完成上一部分中的步骤,请跳过本部分。

    以下命令用于在 Windows 计算机上创建测试解决方案。 对于 macOS 和 Unix,请将 ren 命令更新为 OS 版本的 ren 以重命名文件:

    .NET Core CLI
    dotnet new sln -o unit-testing-using-dotnet-test
    cd unit-testing-using-dotnet-test
    dotnet new classlib -o PrimeService
    ren .PrimeServiceClass1.cs PrimeService.cs
    dotnet sln add ./PrimeService/PrimeService.csproj
    dotnet new xunit -o PrimeService.Tests
    dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
    

    请按照上一部分中的“将 PrimeService.cs 中的代码替换为以下代码”的说明进行操作。

    创建测试

    测试驱动开发 (TDD) 中的一种常用方法是在实现目标代码之前编写测试。 本教程使用 TDD 方法。 IsPrime 方法可调用,但未实现。 IsPrime 的测试调用失败。 对于 TDD,会编写已知失败的测试。 更新目标代码使测试通过。 你可以重复使用此方法,编写失败的测试,然后更新目标代码使测试通过。

    更新 PrimeService.Tests 项目:

    • 删除 PrimeService.Tests/UnitTest1.cs。
    • 创建 PrimeService.Tests/PrimeService_IsPrimeShould.cs 文件。
    • 将 PrimeService_IsPrimeShould.cs 中的代码替换为以下代码:
    C#
    using Xunit;
    using Prime.Services;
    
    namespace Prime.UnitTests.Services
    {
        public class PrimeService_IsPrimeShould
        {
            [Fact]
            public void IsPrime_InputIs1_ReturnFalse()
            {
                var primeService = new PrimeService();
                bool result = primeService.IsPrime(1);
    
                Assert.False(result, "1 should not be prime");
            }
        }
    }
    

    [Fact] 属性声明由测试运行程序运行的测试方法。 从 PrimeService.Tests 文件夹运行 dotnet testdotnet test 命令生成两个项目并运行测试。 xUnit 测试运行程序包含要运行测试的程序入口点。 dotnet test 使用单元测试项目启动测试运行程序。

    测试失败,因为尚未实现 IsPrime使用 TDD 方法,只需编写足够的代码即可使此测试通过。 使用以下代码更新 IsPrime

    C#
    public bool IsPrime(int candidate)
    {
        if (candidate == 1)
        {
            return false;
        }
        throw new NotImplementedException("Not fully implemented.");
    }
    

    运行 dotnet test测试通过。

    添加更多测试

    为 0 和 -1 添加素数测试。 你可以复制上述测试并将以下代码更改为使用 0 和 -1:

    C#
    var primeService = new PrimeService();
    bool result = primeService.IsPrime(1);
    
    Assert.False(result, "1 should not be prime");
    

    仅当参数更改代码重复和测试膨胀中的结果时复制测试代码。 以下 xUnit 属性允许编写类似测试套件:

    • [Theory] 表示执行相同代码,但具有不同输入参数的测试套件。
    • [InlineData] 属性指定这些输入的值。

    可以不使用上述 xUnit 属性创建新测试,而是用来创建单个索引。 替换以下代码:

    C#
    [Fact]
    public void IsPrime_InputIs1_ReturnFalse()
    {
        var primeService = new PrimeService();
        bool result = primeService.IsPrime(1);
    
        Assert.False(result, "1 should not be prime");
    }
    

    替换为以下代码:

    C#
    [Theory]
    [InlineData(-1)]
    [InlineData(0)]
    [InlineData(1)]
    public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
    {
        var result = _primeService.IsPrime(value);
    
        Assert.False(result, $"{value} should not be prime");
    }
    

    在前面的代码中,[Theory][InlineData] 允许测试多个小于 2 的值。 2 是最小的素数。

    运行 dotnet test,其中两个测试失败。 若要使所有测试通过,请使用以下代码更新 IsPrime 方法:

    C#
    public bool IsPrime(int candidate)
    {
        if (candidate < 2)
        {
            return false;
        }
        throw new NotImplementedException("Not fully implemented.");
    }
    

    遵循 TDD 方法,添加更多失败的测试,然后更新目标代码。 请参阅已完成的测试版本库的完整实现

    已完成的 IsPrime 方法不是用于测试素性的有效算法。

    其他资源

    • dotnet new sln -o unit-testing-using-dotnet-test
      

      dotnet new sln 命令用于在 unit-testing-using-dotnet-test 目录中创建新的解决方案。

    • 将目录更改为 unit-testing-using-dotnet-test 文件夹。

    • 运行下面的命令:

      .NET Core CLI
    • dotnet new classlib -o PrimeService
      

      dotnet new classlib 命令用于在 PrimeService 文件夹中创建新的类库项目。 新的类库将包含要测试的代码。

    • Class1.cs 重命名为 PrimeService.cs

    • 将 PrimeService.cs 中的代码替换为以下代码:

      C#
    • dotnet sln add ./PrimeService/PrimeService.csproj
      
    • 运行以下命令创建 PrimeService.Tests 项目:

      .NET Core CLI
    • dotnet new xunit -o PrimeService.Tests
      
    • 上面的命令:

      • 在 PrimeService.Tests 目录中创建 PrimeService.Tests 项目。 测试项目将 xUnit 用作测试库。
      • 通过将以下 <PackageReference /> 元素添加到项目文件来配置测试运行程序:
        • “Microsoft.NET.Test.Sdk”
        • “xunit”
        • “xunit.runner.visualstudio”
    • 运行以下命令将测试项目添加到解决方案文件:

      .NET Core CLI
    • dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
      
    • PrimeService 类库作为一个依赖项添加到 PrimeService.Tests 项目中:

      .NET Core CLI
  • 相关阅读:
    C#中KeyDown和KeyPress区别
    c#快捷键设置和text输入限制
    问题总结
    c#串口编程和单片机通信重大发现
    c#类似单片机的8bit或运算
    c#中将默认常量(32bit)转换为8bit
    我的秋季个人阅读计划
    学期总结
    阅读笔记《软件秘籍》03
    阅读笔记--09
  • 原文地址:https://www.cnblogs.com/luluping/p/13934941.html
Copyright © 2011-2022 走看看