.net 单元测试
都说测试驱动开发,但是想写好单元测试其实不容易,不是因为测试用例难以构造,而是因为很多时候方法非常复杂
其中部分测试想要完成就十分费力,其中让人崩溃的地方主要如下:
- 实例私有函数
- 实例静态私有函数
- 十分难以构造的对象
实例私有函数
继承重写
可以通过反射来进行测试,但是想想你写的代码才200行,测试的代码1000行,就让你很崩溃
之前我主要是把这个方法写成protected 然后通过在测试代码中写子类来进行测试。
但是事实上这已经破坏了封装,而且很多时候,为了能够写出测试,不得不改变API的设计,将一些私有实例变量都扔到了参数里面,方便自己写测试。
// 原来的类
public class A{
private SomeType someType;
private SomeType someMethod();
}
// 通过改变原来的类的限制,将其改为protected
public class A {
protected SomeType someType;
protected SomeType someMethod();
}
// 尤其是当测试的函数可能只是改变对象状态的void方法的时候,为了验证对象状态的改变,就必须使用protected限制符
// 通过这种方法进行测试其实比较麻烦,而且还破坏了原来的设计
class TestClass : A {
public SomeType testSomeMethod() {
return base.someMethod();
}
}
不过,当用来测试部分的本来就是用来继承的类的时候,这个方法还算可以
当然还有一个很方便的方法,就是使用PrivateObject
PrivateObject
// 比如这个类内部的私有方法
public class Calculate
private int Add(int a, int b)
{
return a + b;
}
}
// 可以通过微软UT框架自带的PrivateObject来完成,没看源码,不过看到Invoke,估计也是使用反射写的
[TestMethod]
public void TestPrivateAdd()
{
PrivateObject po = new PrivateObject(new Calculate());
Assert.AreEqual(po.Invoke("Add", 1, 2), 3);
}
私有静态方法
当然了,碰到实例方法可以使用继承测试,但是碰到了静态方法,本人立刻就没有办法了,所以Google了一下
发现了微软的PrivateType对象
PrivateType
比较类似于PrivateObject
public class Calculate
{
internal static int AddStatic(int a, int b)
{
return a + b;
}
}
// 可以通过PrivateType的 InvokeStatic来调用静态方法
[TestMethod]
public void TestInternalStaticAdd()
{
PrivateType po = new PrivateType(typeof(Calculate));
Assert.AreEqual(po.InvokeStatic("AddStatic", 1, 2), 3);
}
难以构造的对象
最简单的例子,你测试一个网络请求的时候,构造一个request就让人吐血
当做一个复杂系统的时候,哪怕你只调用一个复杂结构的部分对象,但是因为对象的复杂,你可能就需要阅读超多的API
所以就有了Mock框架,本文使用的Mock框架是Moq的mock对象,用起来还算简单
感觉很有元编程的感觉
// 之前测试的时候因为读取数据库的对象是一个IDataReader
// 看到这个接口我完全不知道怎么构造,该使用哪一个子类来构造,但是有了Mock就不同了
[TestMethod()]
public void FillRuleTest()
{
// 通过mock来构造复杂对象,其中IDataReader是我需要构造的对象
Mock<IDataReader> mock = new Mock<IDataReader>();
mock.Setup(m => m["abc"]).Returns("abc");
// 构造完成后,可以通过mock.Object来获取对应构造的对象
IDataReader mockObj = mock.Object;
Assert.AreEqual(mockObj["abc"].ToString(), "abc");
// 现在构造参数就会容易很多,你写的Returns也能返回你想要的值
}
.net 单元测试的更多相关文章
- Intellij idea添加单元测试工具
1.idea 版本是14.0.0 ,默认带有Junit,但是不能自动生成单元测试,需要下载JunitGererator2.0插件 2.Settings -Plugins,下载 JunitGenerat ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- Python的单元测试(一)
title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- 使用NUnit为游戏项目编写高质量单元测试的思考
0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...
- 我这么玩Web Api(二):数据验证,全局数据验证与单元测试
目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试 一.模型状态 - ModelState 我理解 ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
- python_单元测试unittest
Python自带一个单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 步骤1:首先引入unittest模块--import un ...
- .Net中的AOP系列之《单元测试切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 使用NUnit编写测试 编写和运行NUnit测试 切面的测试策略 Castle DynamicProxy测试 测试一个拦截器 注入依赖 ...
- React单元测试——十八般兵器齐上阵,环境构建篇
一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...
随机推荐
- vijos - P1279Leave-绿光(数学归纳法 + python)
P1279Leave-绿光 Accepted 标签:[显示标签] 背景 期待这一份幸运,和一份冲劲,多么奇异的际遇--. 燕姿在演唱完绿光这首歌后,出给了姿迷一个考题. 北欧有一个传说! 人一生中能看 ...
- BZOJ 2048 2009国家集训队 书堆 数学算法
题目大意:经典的物理上的桌边堆书问题,初中物理老师以前还讲过,只是仅仅记住了结论. . . 没关系,简单证明一下就好 首先我们设由上至下第i本书比它以下那本书多伸出去的长度为a[i],前缀和为s[i] ...
- Atitit. C# java 的api 文件夹封装结构映射总结
Atitit. C# java 的api 文件夹封装结构映射总结 C# java ref System.Reflection System.Type. java.lang.ref concurren ...
- SQL Server 2005数据库定期备份(非常详细)与 SQL Server 2005数据库备份定期清理
SQL Server 2005数据库定期备份 分类: SQL Server 20052011-01-06 16:25 3320人阅读 评论(1) 收藏 举报 sql server数据库sqlserv ...
- csharp OverflowException——超出数值范围会抛出异常
OverflowException 會在下列情況下執行階段擲回︰ 算術運算會產生作業所傳回的資料型別範圍之外的結果. 下列範例說明 OverflowException 超出範圍的乘法運算所擲回 Int ...
- Codeforces--598A--Tricky Sum(数学)
Tricky Sum Tricky SumCrawling in process... Crawling failed Time Limit:1000MS Memory Limit:26 ...
- C# List常识之经常被忽略的常识
最近在接收前辈的代码,越来越会发现有很多.net已经封装好的方法可以使用,我们却不知道,然后自己去For/Foreach循环解决自己的需求问题 总的来说:当下很忧伤啊.总结了几个经常需要用却不知道的方 ...
- python 46 盒模型 与盒模型布局
一:盒模型 1. 盒模型的概念 广义盒模型:文档中所有功能性及内容性标签,及文档中显示性标签 侠义盒模型:文档中以块级形式存在的标签(块级标签拥有盒模型100%特性且最常用) 盒模型组成:margi ...
- mysql 年龄计算(根据生日字段)
mysql 年龄计算(根据生日字段) year( from_days( datediff( now( ), birthdate))) //获取年龄 now() 当前时间,精确到秒 datediff(b ...
- 用xftp从win7系统传输一些必要的文件到Linux
新建会话,主机名为Linux系统的ip地址,选用SFTP协议,选用UTF-8编码格式 1.安装JDK 切换到java路径下 卸载openJDK: 用rpm -qa |grep java指令查看 用rp ...