• C# 8.0和.NET Core 3.0高级编程 分享笔记六:第三部分单元测试


    修复代码中的bug所要付出的代码很昂贵。开发过程中发现错误的时间越早,修复成本就越低。

    单元测试是在开发早期发现BUG的好方法。一些开发人员甚至遵循这样的原则:程序员应该在编写代码之前创建单元测试,这成为测试驱动开发(Text-Driven Development,TDD)。

    微软提供了专用的单元测试框架,名为MSTest;但是,这里将使用第三方单元测试框架xUnit.net。

    4.4.1创建需要测试的类库

    执行如下步骤:

    (1)在Chapter04文件夹中创建2个名为CalculatorLib和CalculatorLibUnitTests的子文件夹,并将它们分别添加到工作区。(我因为操作失误,从新创建了Calculator文件夹)其他步骤一样,添加创建2个子文件夹,然后右键添加到工作区。

    (2)导航到Terminal|new Terminal并选择CalculatorLib。

    (3)在终端窗口中输入以下命令:

    dotnet new classlib

    (4)将名为Class1.cs的文件重命名为Calculator.cs。

    (5)修改Calculator.cs文件以定义为Calculator类(带有故意的错误吧加法写成乘法),如果你觉得代码比较乱Visual Studio Code下使用Ctrl+A全选,然后使用Ctrl+K和Ctrl+F组合键自动格式化代码布局,如下所示:

    namespace CalculatorLib;
    public class Calculator
    {
        public double Add(double a, double b)
        {
            return a * b;
        }
    }
    

    (6)在终端窗口中输入以下命令:

    dotnet build

    (7)导航到Terminal|New Terminal并选择CalculatorLibUnitTests。

    (8)在终端窗口中输入以下命令:

    dotnet new xunit

    (9)单击名为CalculatorLibUnitTests.csproj的文件,修改配置以添加ItemGroup部分,其他包含对CalculatorLib项目的引用,如下所示:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
    
        <IsPackable>false</IsPackable>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
        <PackageReference Include="xunit" Version="2.4.1" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
          <PrivateAssets>all</PrivateAssets>
        </PackageReference>
        <PackageReference Include="coverlet.collector" Version="3.0.2">
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
          <PrivateAssets>all</PrivateAssets>
        </PackageReference>
      </ItemGroup>
    <ItemGroup>
    <ProjectReference Include="..CalculatorLibCalculatorLib.csproj"/>
    
    </ItemGroup>
    </Project>
    
    

    (10)将文件UnitTest1.cs重命名为CalculatorUnitTests.cs

    (11)在终端窗口中输入以下命令:

    dotnet build

    4.4.2 编写单元测试

    好的单元测试包含如下三个部分。

    • Arrange:这部分为输入输出声明和实例化变量。
    • Act:这部分执行想要测试的单元。在我们的例子中,这意味着调用要测试的方法。
    • Assert:这部分对输出进行断言。断言是一种信念,如果不为真,则表示测试失败。例如,当计算2+2时,期望结果是4。

    现在我们为Calculator类编写单元测试。

    (1)打开CalculatorUnitTests.cs,将类重命名为CalculatorUnitTests,导入CalculatorLib名称空间,然后修改CalculatorUnitTests类,使其拥有两个测试方法,分别计算2加2以及2加3,如下所示:

    using Xunit;
    using System;
    using CalculatorLib;
    namespace CalculatorLibUnitTests;
    
    public class CalculatorUnitTests
    {
        [Fact]
        public void TestAdding2And2()
        {
            //arrange
            double a=2;
            double b=2;
            double expected=4;
            var calc=new Calculator();
            //act
        double actual=    calc.Add(a,b);
        Assert.Equal(expected,actual); 
        }
    
        [Fact]
        public void TestAdding2And3()
        {
        //arrange
        double a=2;
        double b=3;
        double expected=5;
        var calc=new Calculator();
        //act
        double actual=calc.Add(a,b);
    
        //assert
        Assert.Equal(expected,actual);
         
        }
    }
    

    4.4.3运行单元测试

    (1)在CalculatorLibUnitTest项目的终端窗口中输入以下命令:

    dotnet test

    (2)请注意,输出结果表面运行了2个测试:一个测试通过,另一个测试失败。

    (3)纠正A的的方法中的乘法为加法。

    (4)再次运行单元测试,你会发现BUG修复,测试通过了。

    PS D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTests> dotnet test
      正在确定要还原的项目…
      所有项目均是最新的,无法还原。
         at CalculatorLibUnitTests.CalculatorUnitTests.TestAdding2And3() in D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTestsCalculatorUnitTests.cs:line 33
    失败!  - 失败:     1,通过:     1,已跳过:     0,总计:     2,持续时间: 2 ms - CalculatorLibUnitTests.dll (net6.0)
    PS D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTests>PS D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTests>PS D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTests> dotnet test
      正在确定要还原的项目…  所有项目均是最新的,无法还原。
      你正在使用 .NET 的预览版。请查看 https://aka.ms/dotnet-core-preview  CalculatorLib -> D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibinDebug
    et6.0CalculatorLib.dll
      CalculatorLibUnitTests -> D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTestsinDebug
    et6.0CalculatorLibUnitTests.dllD:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTestsinDebug
    et6.0CalculatorLibUnitTests.dll (.NETCoreApp,Version=v6.0)的测试运行
    Microsoft (R) 测试执行命令行工具版本 17.0.0-preview-20210817-02
    版权所有 (C) Microsoft Corporation。保留所有权利。
    正在启动测试执行,请稍候...
    总共 1 个测试文件与指定模式相匹配。
    已通过! - 失败:     0,通过:     2,已跳过:     0,总计:     2,持续时间: 2 ms - CalculatorLibUnitTests.dll (net6.0)PS D:LearningRecordsdocC#NetCoreWorkspaceCodeCalculatorCalculatorLibUnitTests>
    
  • 相关阅读:
    from __future__ import with_statement
    第六章 Flask数据库(二)
    python面向对象基础(四)内置方法 __xx__之new与init
    MySQL用户自定义变量
    iOS不得姐项目--appearance的妙用,再一次设置导航栏返回按钮,导航栏左右按钮的封装(巧用分类)
    iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
    iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态
    iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
    iOS开发小技巧--边接受数据边写入文件的两种方法
    iOS边练边学--文件压缩和解压缩的第三方框架SSZipArchive的简单使用
  • 原文地址:https://www.cnblogs.com/duwenlong/p/15518673.html
Copyright © 2020-2023  润新知