zoukankan      html  css  js  c++  java
  • 不再为命名而苦恼!使用 MSTestEnhancer 单元测试扩展,写契约就够了

    有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,你不是一个人!看看这个你就知道了:程序员最头疼的事:命名 或它的英文原文 Don’t go into programming if you don’t have a good thesaurus - ITworld

    立刻前往 nuget.org 下载安装 MSTestEnhancer 即可解决命名的苦恼。


     

    体验 MSTestEnhancer

    看看苦恼的单元测试怎么写:

    [TestClass]
    public class 被测类名Test
    {
        [TestMethod]
        public void 被测方法名_条件1_预期1()
        {
            // 测试用例代码
        }
    
        [TestMethod]
        public void 被测方法名_条件2_预期2()
        {
            // 测试用例代码
        }
    }

    这是以 MSTest 为例,但 NUnit、XUnit 等编写体验于此也类似,都需要为测试方法命名。在这个例子中,我们写了中文的 条件预期,在实际编写时,可能是更加复杂的短句,例如:ArgumentNullThrowsArgumentNullException,于是最终的方法名可能是 TargetMethod_ArgumentNull_ThrowsArgumentNullException。这样的方法多了也就难以读懂单元测试的代码了。

    然而现在看看 MSTestEnhancer 的单元测试怎么写:

    [TestClass]
    public class 被测类名Test
    {
        [ContractTestCase]
        public void 被测方法名()
        {
            "契约 1(当 Xxx 时,应该发生 Yyy)".Test(() =>
            {
                // 测试用例代码
            });
    
            "契约 2(但当 Zzz 时,应该发生 Www)".Test(() =>
            {
                // 测试用例代码
            });
        }
    }

    有没有觉得很直观?条件和预期直接以中文字符串的形式写在了代码里,所有契约的阅读一目了然。而且由于不需要再写条件和预期了,所以测试方法名可以与被测方法名完全一样。也就是说——再也不用为单元测试的方法取名字而伤透脑筋了。

    可是,工具支持呢?不要紧,在工具中也能显示中文的契约,Visual Studio 中的测试管理器和 ReSharper 测试结果页都支持显示这些中文的契约。以下是 ReSharper 的单元测试结果页视图:

    单元测试结果页

    每个契约按照方法名归类防止,测试结果一目了然。

    参数化的单元测试

    有些契约需要更多的值组合来验证正确性,那么可以在契约测试用例的后面添加参数。

    "质数".Test((int num) =>
    {
        // 测试用例代码
    }).WithArguments(2, 3, 5, 7, 11);
    
    "{0} 不是质数".Test((int num) =>
    {
        // 测试用例代码
    }).WithArguments(1, 4);

    也可以添加多个参数(最多支持 8 个):

    "契约 1,参数中可以带 {0} 和 {1}。".Test((int a, int b) =>
    {
        // 现在,a 会等于 2,b 会等于 3。
    }).WithArguments(2, 3);
    
    "契约 2".Test((int a, int b) =>
    {
        // 现在有两组代码,一组 a=2, b=3;另一组 a=10, b=20// 当然也可以传入元组数组。
    }).WithArguments((2, 3), (10, 20));

    在显示单元测试结果时,如果契约字符串中含有格式化占位符 {0}{1} 等,会被自动替换为参数的值。

    异步的单元测试

    Test 方法中传入的每个 Action 都支持 async 关键字,并会在执行测试用例时等待异步操作结束。

    额外的黑科技

    MSTest v2 支持嵌套类型的单元测试。也就是说,我们可以利用这一点做出近乎无限层级的单元测试树出来。

  • 相关阅读:
    IsEmpty函数和IsNull函数之间的区别
    JavaScript的self和this使用小结
    PHP中读写文件实现代码
    ExtJs的数据代理proxy
    php递归列出所有文件和目录的代码
    解析Extjs与php数据交互(增删查改)
    MySql 批量创建、导入实例
    MySQL 进入 导入
    小知识:批量导入数据
    js 扩展实例
  • 原文地址:https://www.cnblogs.com/walterlv/p/10236486.html
Copyright © 2011-2022 走看看