不再为命名而苦恼!使用 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 等编写体验于此也类似,都需要为测试方法命名。在这个例子中,我们写了中文的 条件 和 预期,在实际编写时,可能是更加复杂的短句,例如:ArgumentNull、ThrowsArgumentNullException,于是最终的方法名可能是 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 支持嵌套类型的单元测试。也就是说,我们可以利用这一点做出近乎无限层级的单元测试树出来。
不再为命名而苦恼!使用 MSTestEnhancer 单元测试扩展,写契约就够了的更多相关文章
- 4项技巧使你不再为PHP中文编码苦恼
		
PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码,中国的 GB2312-80,日本的 JI ...
 - VisualStudio中的单元测试
		
1. VisualStuio中的测试资源管理器.CodeLens和ReSharper 上一篇文章重温了<单元测试的艺术>里提到的单元测试的技术及原则.这篇文章实践使用VisualStudi ...
 - 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC
		
一.[前言] (1)本文将用到IOC框架Unity,可参照<Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备>(2)本文的解决方案是基于前述<使用I ...
 - Python自动单元测试框架
		
原文链接:http://www.ibm.com/developerworks/cn/linux/l-pyunit/ 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写 ...
 - [转] Python自动单元测试框架
		
一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software ...
 - 在Python中进行自动化单元测试的教程
		
From: https://www.jb51.net/article/64119.htm 一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必 ...
 - Python之自动单元测试之一(unittest使用实例)
		
软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作.既然如此,为什么不让程序员在编写软 ...
 - GO学习-(20) Go语言基础之单元测试
		
Go语言基础之单元测试 不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go ...
 - 使用NUnit为游戏项目编写高质量单元测试的思考
		
0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...
 
随机推荐
- RK61 Keyboard Use
			
~ 打法: FN+shift+Esc / ? Alt Files Ctral <=> 上 下 左 右 打法:FN+shift 切换 解锁键盘 打法:FN+win 蓝牙连接 打法:FN+ ...
 - 学习webpack3.x过程中遇到的问题:webpack-dev-server
			
这篇博客主要记录的是本人在学习webpack3.x的过程中遇到的问题(虽然这几天4.0刚出来,但是我还是先学一下3.x吧) 1.配置文件可以用webpack启服务和热更新,步骤如下: ① 先下载:we ...
 - Linux命令详解-mv
			
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
 - nyoj115——裸dijksta(点之间最短路)
			
城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...
 - C# - Generics泛型,一图话c#泛型
			
一.一篇好文 https://www.cnblogs.com/yueyue184/p/5032156.html 二.一幅好图
 - js中页面加载完成后执行的几种方式及执行顺序
			
1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是docu ...
 - jqeury 基础
			
jquery 选择器: 基本选择器:#id ..class.*(匹配所有) 层次选择器: $(div span) 选取<div>里的所有的<span>元素. $(div> ...
 - 模式窗体中调用父页面js与非模式化调用非父页面的js方法
			
最近项目中使用模式窗体,遇到以下问题记录一下: 模式窗体:你必须关闭该窗体,才能操作其它窗体:比如说,必须按确定或取消,或者按关闭. 非模式窗体:不必关闭该窗体,就可转换到其它窗体上进行操作. 一:非 ...
 - 【Html 学习笔记】第六节——列表
			
无序列表:<ul></ul> 有序列表:<ol start=$num></ol> 不同类型的无序列表:<ul type="***&quo ...
 - nodejs之log4js日志记录模块简单配置使用
			
在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...