c#中使用METest单元测试

METest是一个用于测试C#代码的单元测试框架。单元测试是一种软件测试方法,用于验证代码的各个单元(函数、方法、类等)是否按照预期工作。METest提供了一种简单而强大的方式来编写和运行单元测试。

  • TestMethod:这是一个特性,用于标记测试方法。
  • Assert:这是一个断言类,用于验证测试结果是否符合预期。
  • DataTestMethod属性:用于标记一个方法作为参数化测试方法。
  • DataRow属性:用于提供参数值,每个参数值对应一个测试用例。

使用单元测试测试

点击VS项目解决方案>> MSTest单元测试项目

建好单元项目引入需要测试的项目

AAA(准备、执行、断言)模式

是编写待测试方法的单元测试的常用方法:

  • 准备(Arrange),单元测试方法的准备部分初始化对象并设置传递给待测试方法的数据;
  • 执行(Act),执行部分调用具有准备参数的待测试方法;
  • 断言(Assert),断言部分验证待测试方法的执行行为与预期相同。
csharp 复制代码
[TestMethod()]
public void GetTriangle_Test()
{
    // arrange  
    string[] sideArr = { "5", "5", "5" }; // 准备传给待测试方法的数据
    string expected = "等边三角形";
    // act  
    var actual = UnitTestClass.GetTriangle(sideArr); // 调用测试方法
    // assert  
    Assert.AreEqual(expected, actual); // 验证待测试方法的执行结果是否与预期相同
}

参数化测试

同样的逻辑,根据输入参数不同给出不同的结果。因为只是参数不同,所以并不希望把测试方法写多遍,但是又希望对每个参数的测试成为一个独立的测试用例。举例说,假定我有一个数学计算的方法是把两个整数相加求和,我希望证明这个方法对于任意两个数都是通过的。

csharp 复制代码
[DataTestMethod] //注明这个方法是参数化测试方法;
[DataRow("0508")] //一组参数,参数可以是任何值;但是一定要和参数的测试方法匹配。
[DataRow("0509")]
[DataRow("0005")]
public void GetFlag(string name)
{
    //act 执行部分 调用具有准备参数的待测方法
    var r = fun.Flag("D", "R", name);
    //assert 断言部分 验证预期和实际结果是否相同
    Assert.AreEqual(name, r);
}

这里有一个要点,参数的个数设置多少个,因为测试的方法适合三个参数,所以大部分的人都认为是三个参数就够了,其实不是,应该是四个参数,还有一个是结果值。看上面的代码,我们最后断言的标准是期望值和实际值进行对比,而期望值是来自参数组

测试示例1

csharp 复制代码
using Autofac;
using MerryDllFramework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MsTestMerryDLL
{
    [TestClass]
    public class UnitTest1
    {
        Functional fun;
        private static IContainer Container
        {
            set;
            get;
        }

        [ClassInitialize]
        public static void ClassInitialize(TestContext testContext)
        {
            // 在测试类初始化之前进行调用的方法
        }

        [TestInitialize]
        public void TestInitialize()
        {
            // 在每个测试方法执行之前进行调用的方法
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<Functional>().As<Functional>().SingleInstance();
            Container = builder.Build();
            fun = Container.Resolve<Functional>();
            var res = fun.USB("D", 1);
            Assert.AreEqual(expected: "True", res);
        }

        [TestCleanup]
        public void TestCleanup()
        {
            // 在每个测试方法执行之后进行调用的方法
            var res = fun.USB("D", 0);
            Assert.AreEqual("True", res);
        }

        [DataTestMethod]
        [DataRow("0508")]
        [DataRow("0509")]
        [DataRow("0005")]
        public void GetFlag(string name)
        {
            // 测试方法
            var r = fun.Flag("D", "R", name);
            Assert.AreEqual(name, r);
        }
    }
}
相关推荐
全栈人月10 小时前
使用 Kilo Code 解决遗留代码恐惧症
人工智能·单元测试·代码规范
阿狸猿17 小时前
论单元测试方法及应用
单元测试
折哥的程序人生 · 物流技术专研2 天前
【电商多平台电子面单对接实战|第二篇】抖音代发电子面单对接:从“面条代码”到整洁架构的涅槃之路
设计模式·架构·系统架构·单元测试·代码规范·单一职责原则
无忧.芙桃2 天前
vibe coding之opencode的使用
ai·单元测试·opencode
lpd_lt3 天前
如何让AI生成项目的单元测试,propmt技巧详解
java·人工智能·单元测试·ai编程
ai_coder_ai3 天前
论单元测试方法及应用
单元测试
川石课堂软件测试4 天前
性能测试|JMeter常用线程组设置策略
大数据·数据库·功能测试·测试工具·jmeter·mysql·单元测试
川石课堂软件测试4 天前
什么是埋点测试,app埋点测试怎么做?
功能测试·测试工具·华为·小程序·单元测试·appium·harmonyos
不会就选b5 天前
数据结构之如何让opencode帮我们完成单元测试
单元测试
FFZero15 天前
[mpv脚本系统] (二) Lua三层闭包实现自动资源管理
junit·单元测试·lua