• c#中使用METest单元测试


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

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

    使用单元测试测试

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

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

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

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

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

    参数化测试

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

    [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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    测试示例1

    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);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    一个函数如何实现return好几个返回值(借鉴学习前辈的文章,链接放文章里了)
    刷题记录(NC235267 星球大战,NC216012 Let‘s Play Curling,NC235294 任务,NC235569 牛可乐与NCPC)
    Nacos简介。什么是Nacos?Nacos注册中心配置。Nacos入门教程
    (12)使用TSQL语句 ALTER VIEW 修改v_stu_i视图,使其具有列名学号、姓名、性 政治面貌,补全以下横线处的语句。
    gcc编译选项
    Android 自定义view 圆形进度条
    Java:2022年招聘Java开发人员指南
    ECharts的配置(一)
    Promise笔记-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题
    c++面试题目汇总-1-57
  • 原文地址:https://blog.csdn.net/qq_35624605/article/details/134198501