有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,你不是一个人!看看这个你就知道了:程序员最头疼的事:命名 或它的英文原文 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 支持嵌套类型的单元测试。也就是说,我们可以利用这一点做出近乎无限层级的单元测试树出来。

不再为命名而苦恼!使用 MSTestEnhancer 单元测试扩展,写契约就够了的更多相关文章

  1. 4项技巧使你不再为PHP中文编码苦恼

    PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码,中国的 GB2312-80,日本的 JI ...

  2. VisualStudio中的单元测试

    1. VisualStuio中的测试资源管理器.CodeLens和ReSharper 上一篇文章重温了<单元测试的艺术>里提到的单元测试的技术及原则.这篇文章实践使用VisualStudi ...

  3. 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC

    一.[前言] (1)本文将用到IOC框架Unity,可参照<Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备>(2)本文的解决方案是基于前述<使用I ...

  4. Python自动单元测试框架

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-pyunit/ 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写 ...

  5. [转] Python自动单元测试框架

    一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software ...

  6. 在Python中进行自动化单元测试的教程

    From: https://www.jb51.net/article/64119.htm 一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必 ...

  7. Python之自动单元测试之一(unittest使用实例)

    软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作.既然如此,为什么不让程序员在编写软 ...

  8. GO学习-(20) Go语言基础之单元测试

    Go语言基础之单元测试 不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go ...

  9. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

随机推荐

  1. Python基础笔记系列八:字符串的运算和相关函数

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 字符串的运算1.字符串的加法和乘法 python中不但支持字符串相加,还支 ...

  2. 一些putty的应用设置

    把windows下putty的key转换成linux上使用的rsa key    http://ask.apelearn.com/question/937 putty生成的密钥导入connectbot ...

  3. springboot统一异常处理及返回数据的处理

    一.返回code数据的处理 代码: Result.java /** * http请求返回的最外层对象 * Created by 廖师兄 * 2017-01-21 13:34 */ public cla ...

  4. HTML5 history API,创造更好的浏览体验

    HTML5 history API有什么用呢? 从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残 ...

  5. TileMode(平铺模式) 枚举的成员:

    TileMode(平铺模式) 枚举的成员:   成员名称 说明   FlipX 与 Tile 相同,只不过图块的交替列被水平翻转. 基本图块本身不翻转.   FlipXY FlipX 和 FlipY ...

  6. [转]通过rsync+inotify-tools+ssh实现触发式远程实时同步

    文件的同步镜像在很多地方都需要用到,因此rsync这款免费软件得到了广泛的应用,包括在Windows平台上,都已经有了支持rsync的“cwRsyncServer”. 但是,我们一般都是通过结合cro ...

  7. rsa加解密密钥生成命令

    (1)生成原始RSA私钥文件 rsa_private_key.pem(原始私钥) openssl genrsa -out rsa_private_key.pem 2048 (2)将原始RSA私钥转换为 ...

  8. 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法

    jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口  |–Execut ...

  9. 020——VUE中变异方法push的留言版实例讲解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 一台服务器的IIS绑定多个域名

    等待十分钟: 在IIS上配置: