【学习笔记】C#中的单元测试
周一老师讲完单元测试以后,感觉挺好玩,通过查资料和相关书籍学到了几种C#在VS2010的测试方法,跟大家分享下,图文并茂啊,有木有~~
1.从被测试的代码中生成单元测试
1.1创建C#控制台程序,命名为AddUnitText
1.2然后先用一小段很简单的代码练习一下
class Program
{
public int Add(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
}
}
1.3然后用下面的步骤创建单元测试
(1)在Add方法体中,在右击菜单中选择创建单元测试,并为这个方法创建单元测试代码的基本框架
(2)点击确定后,系统自动生成单元测试代码,如下所示
namespace AddText
{
/// <summary>
///这是 ProgramTest 的测试类,旨在
///包含所有 ProgramTest 单元测试
///</summary>
[TestClass()]
public class ProgramTest
{ private TestContext testContextInstance; /// <summary>
///获取或设置测试上下文,上下文提供
///有关当前测试运行及其功能的信息。
///</summary>
public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
} #region 附加测试特性
//
//编写测试时,还可使用以下特性:
//
//使用 ClassInitialize 在运行类中的第一个测试前先运行代码
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//
//使用 ClassCleanup 在运行完类中的所有测试后再运行代码
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//
//使用 TestInitialize 在运行每个测试前先运行代码
//[TestInitialize()]
//public void MyTestInitialize()
//{
//}
//
//使用 TestCleanup 在运行完每个测试后运行代码
//[TestCleanup()]
//public void MyTestCleanup()
//{
//}
//
#endregion /// <summary>
///Add 的测试
///</summary>
[TestMethod()]
public void AddTest()
{
Program target = new Program(); // TODO: 初始化为适当的值
int a = ; // TODO: 初始化为适当的值
int b = ; // TODO: 初始化为适当的值
int expected = ; // TODO: 初始化为适当的值
int actual;
actual = target.Add(a, b);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("验证此测试方法的正确性。");
}
}
}
(3)ProgramTest.cs代码文件详讲
[TestMethod()]:说明了以下代码是一个测试用例
Int a = o; // TODO: 初始化为适当的值
int b = 0; // TODO: 初始化为适当的值
这两句是被测函数的输入参数,需要我们去修改它的值,也就是我们输入测试用例的地方。
double expected = 0; // TODO: 初始化为适当的值
double actual;
这两句话浅显易懂,前一句话是定义了期望值和对它进行初始化,后一句话是定义了实际值。默认
Assert.AreEqual(expected, actual);
Assert在这里可以理解成断言:在VSTS里做单元测试是基于断言的测试。
默认代码中Assert.Inconclusive 表明这是一个未经验证的单元测试。在实际的程序中可以注释掉。
(4)还可以在C#项目中自行创建单元测试项目,然后编写测试方法
单元测试的基本方法是调用被测代码的函数,输入函数的参数值,获取返回结果,然后与预期测试结果进行比较,如果相等则认为测试通过,否则认为测试不通过。
1、Assert类的使用
Assert.Inconclusive() 表示一个未验证的测试;
Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;
AreSame() 用于验证指定的两个对象变量是指向相同的对象,否则认为是错误
AreNotSame() 用于验证指定的两个对象变量是指向不同的对象,否则认为是错误
Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;
Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;
Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;
Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过;
2、CollectionAssert类的使用
用于验证对象集合是否满足条件
StringAssert类的使用
用于比较字符串。
StringAssert.Contains
StringAssert.Matches
StringAssert.tartWith
3、附加测试属性的使用
默认都是被注释掉的,只要我们取消注释就可以使用了。这个功能的加入,很大程度上是为了增加测试的灵活性。具体的属性有:
[ClassInitialize()]在运行类的第一个测试前先运行代码
[ClassCleanup()]在运行完类中的所有测试后再运行代码
[TestInitialize()]在运行每个测试前先运行代码
[TestCleanup()]在运行完每个测试后运行代码
4、测试单元NUnit 声明
1.AreEqual
Assert.AreEqual(expected,actual[,string message])
//判断结果与预期是否相等
报告的结果如下:
Assert.AreEqia;(expected,actual,tolerance[,string message])
2.IsNull
Assert.IsNull(object [, string message])
Assert.IsNotNull(object [, string message])
声明给的对象是否属于空
3.AreSame
Assert.AreSame(expected, actual [, string message])
声明是否同类型
4.IsTrue
Assert.IsTrue(bool condition [, string message])
判断返回条件是否为真
5.Fail
Assert.Fail([string message])
测试立即失败。
2.下面是老师课上编写的程序
2.1这是测试代码:
查找list[]中的最大值:int Largest(int list[], int length);
首份实现代码如下:
int Largest(int list[], int length)
{
int i,max;
for(i = 0; i < (length – 1); i ++ )
{
if(list[i] > max)
{ max=list[i]; }
}
return max;
}
2.2编写程序:
static void Main(string[] args)
{
int[] List = new int[];//申明一个长度为3的数组保存录入的3个数
int Max = ;//保存最大值
for (int i = ; i < List.Length; i++)//循环数组
{
Console.WriteLine("请输入第" + (i + ) + "个数:");
List[i] = int.Parse(Console.ReadLine());//循环将录入的数字保存到数组
if (List[i] > Max)//判断当前数字是否大于最大值
{
Max = List[i];//将最大值赋值给Max
}
}
Console.WriteLine("最大的数是:{0}",Max);//输出最大值
Console.ReadLine();
}
2.3在此测试的过程中发现无法对程序进行有效的测试,所以重新写了方法
namespace MUnitText
{
public class LIU
{
/// <summary>
/// 把返回的最大值放在list中
/// </summary>
/// <param name="list">一列整数</param>
/// <returns>最大值返回给出的list中</returns>
public static int Largest(int[] list)
{
int i, max = Int32.MaxValue;
for (i = ; i < list.Length - ; i++)
{
if (list[i] > max)
{
max = list[i];
}
}
return max;
}
}
}
2.4创建单元测试
测试了多组数据以后,验证了老师上课提到的那些错误。
给一列数字[7,8,9].这个方法返回9.这是很符合常理的一个测试用例。但是,另外的测试用例如何想?
要写多少测试用例?
下面给出测试思想。
[7,8,9]—>9
[8,9,7]—>9
[9,7,8]—>9
当有重复的最大的数字时候将会发生什么?
[7,9,8,9]—>9
因为只存在int类型,没有objects类型,所以你可能不会关系9返回的是什么类型。
那么当只有1个数字的时候,它将会是什么?
[1]—>1
并且当出现负数时候又会发生什么情况:
[-9,-8,-7]—>-7
可以很很简单的看出来-7比-9大。
2.5编写测试方法
首先:通过Globally assembly cath调用using NUnit.Framework;
NUnit框架提供我们需要的单元测试的功能。
下一步,我们要定义一个类:每一个类包含着测试用例状态属性的注释。必须被声明为共有的,它必须有一个共有的,没有参数和构造器的。
最终,这个测试类包含单个带有测试属性的测试方法。
using NUnit.Framework; [TestFixture] public class TestSimple{ [Test] public void LargestOf3(){ Assert.AreEqual(,Cmp.Largest(new int[]{,,})); Assert.AreEqual(,Cmp.Largest(new int[]{,,})); Assert.AreEqual(,Cmp.Largest(new int[]{,,})); } }
测试了一上午,太不容易了,抓紧搞电梯了。。
【学习笔记】C#中的单元测试的更多相关文章
- ArcGIS案例学习笔记-点集中最近点对和最远点对
ArcGIS案例学习笔记-点集中最近点对和最远点对 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于点图层,查找最近的点对和最远的点对 数据: 方法: 1. ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- 电磁兼容性设计学习笔记--PCB中地的布局
http://bbs.ednchina.com/BLOG_ARTICLE_3010439.HTM PCB上元器件的布局对整个PCB板的电磁兼容性影响很大,所以从事硬件电路设计的工程师很有必要学习PCB ...
- JavaScript学习笔记——JS中的变量复制、参数传递和作用域链
今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- 设计模式学习笔记——java中常用的设计模式
单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...
- TDD学习笔记【二】---单元测试简介
大纲 Testing 的第一个切入点:单元测试. 本篇文章将针对单元测试进行简介,主要内容包含了5W: Why What Where Who When 而How 的部分,属于实现部分,将于下一篇文章介 ...
- cips2016+学习笔记︱NLP中的消岐方法总结(词典、有监督、半监督)
歧义问题方面,笔者一直比较关注利用词向量解决歧义问题: 也许你寄希望于一个词向量能捕获所有的语义信息(例如run即是动车也是名词),但是什么样的词向量都不能很好地进行凸显. 这篇论文有一些利用词向量的 ...
- android学习笔记----JNI中的c控制java
面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为: 1).将知识分解 ...
- CSS学习笔记——CSS中定位的浮动float
昨天在解决了盒模型的问题之后又出现了新的知识模糊点:浮动和绝对定位?今天先解决浮动相关的问题,首先列举出想要解决的问题: 1.浮动到底是怎么样的? 2.浮动对元素的影响有什么? 3.浮动主要用来干什么 ...
随机推荐
- JavaScript之引用类型(Array类型)
除了Object类型,Array是ECMAScript中最常用的类型了. 与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据. 而且,ECMAScript数组的大小是可以动态调 ...
- Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵
H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...
- Mac下JAVA开发环境搭建
最近开始学习JAVA, 首先配置下环境! 1.Mac自带的jdk版本老了,需要到oracle官网去下载新的jdk,具体下载那个版本看个人需求,然后安装. 安装完成之后打开Terminal, 执行命 ...
- python 数据分析 Matplotlib常用图表
Matplotlib绘图一般用于数据可视化 常用的图表有: 折线图 散点图/气泡图 条形图/柱状图 饼图 直方图 箱线图 热力图 需要学习的不只是如何绘图,更要知道什么样的数据用什么图表展示效果最好 ...
- node.js 中createConnection参数说明
host:主机地址 (默认:localhost) user:用户名 password:密码 port:端口号 (默认:3306) database:数据库名 charset:连接字符集(默认:'UTF ...
- 关于Android架构那些事
刚开始,因为业务比较赶,我们也没有进行比较好的顶层设计,对代码的要求也是最低要求——完成功能开发就行了.这种短期设计也就造成了我们代码的扩展性几乎为零,稍微添加一点新功能,都要大动干戈.在后台系统架构 ...
- 配置安全证书的Etcd集群
不知在哪篇技术文档中看到,kubernetes master和etcd分开部署模式,因为集群的状态都保存在etcd中,这样当kubernetes master挂掉后,通过API Server交互的Sc ...
- 如何将你的github仓库部署到github pages(github.io博客)
详细的git教程:http://www.cnblogs.com/tugenhua0707/p/4050072.html#!comments 作为教程,很重要的一点就是要最大化的傻瓜化,本文将从新建一个 ...
- javaWeb中RSA的加密使用
加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想 ...
- app store 注册账号生成证书上传app完整的教程
app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios ...