VS2010 单元测试入门
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AreEqual 验证指定的两个对象是否相等 AreEqual<T>验证两个泛型资料是否相等 AreNotEqual验证指定的两个对象是否不相等 AreNotEqual<T>验证两个泛型资料是否不相等 AreNotSame验证两个对象变量是否引用不同对象 AreSame验证两个对象变量是否引用相同对象 IsFalse验证指定的条件是否为false IsTrue 验证指定的条件是否为true IsNotNull 验证指定的对象是否不为Nothing IsNull 验证指定的对象是否为Nothing
5
6
白盒测试->基于源代码的测试方法
◦ 静态方法:代码走查 ◦ 动态方法:生成测试用例,驱动程序运行
7
冒泡排序算法
依次比较相邻的两个数,将小 数放在前面,大数放在后面。 即在第一趟:首先比较第1个和 第2个数,将小数放前,大数放 后。然后比较第2个数和第3个 数,将小数放前,大数放后, 如此继续,直至比较最后两个 数,将小数放前,大数放后。 至此第一趟结束,将最大的数 放到了最后。在第二趟:仍从 第一对数开始比较,一直比较 到倒数第二个数,第二趟结束。 如此下去,重复以上过程,直 至最终完成排序。
有复杂对象的测试
◦ 利用DB准备测试用例数据
Windows Forms UI测试
◦ 基于反射获取句柄,发送消息给控件
Web UI测试
◦ 发送HTTP Get请求并取得响应
Javascript测试
◦ ???
24
依据测试驱动开发的流程实践单元测试
◦ ◦ ◦ ◦ ◦ 建立“二分查找”的工程、类及方法结构 建立“二分查找”的测试用例 编写“二分查找”的实现代码(确保可以正确编译) 执行测试用例,并确认测试结果 完善程序代码和测试用例
15
语句覆盖
◦ 每条语句至少被执行一次
判定覆盖
◦ 每个while/if判定条件取得True/False值一次
条件覆盖
◦ 每个布尔表达式均取得True/False值一次 ◦ 完全的条件覆盖不能保证完全的判定覆盖
条件判定组合覆盖
◦ 判定覆盖和条件覆盖的组合
路径覆盖
◦ 所有可能的路径均被执行
16
实际 结果 Y N
Y Y
1. 准备输入数组null 2. 执行方法
1. 准备输入无元素数组 2. 执行方法 1. 准备输入数组{ 32, 12, 6,3} 2. 执行方法
提示数组不能为空
无元素数组 数组 { 3, 6, 12, 32}
Search BubbleSort
Search BubbleSort
算法说明
◦ 假设数组中元素是升序排列,将数组中间位置的值与查找的值比较 。如果两者相等,则查找成功;否则中间值将数组分成前、后两个 子数组,如果中间值大于查找值,则继续查找前一子数组,否则继 续查找后一子数组。重复以上过程,直到找到相等的元素,查找成 功;或直到找不到相等的元素,此时查找不成功。
25
Mock
◦ 建立仿真对象,侧重于与 对象之间的交互,不一定 需要具体的实现。
}
22
1 详细设计 2 构造类/方法/函数的主体框架
3 建立测试工程和测试类
4 依据功能生成测试用例 否 7 结果是 否正确?
5 编写实际的程序代码
6 执行测试用例
否
8 达到 覆盖率?
23
是
9 停止
私有方法测试
◦ 利用.NET反射机制,调用私有方法
欢迎研究与交流
朱优良 defzhu@126.com
26
9
新增测试项目
10
using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class TestClass1 { // 执行该类别中第一项测试前,使用 ClassInitialize 执行程序代码 // [ClassInitialize()] // public static void MyClassInitialize(TestContext testContext) { } // 在类别中的所有测试执行后,使用 ClassCleanup 执行程序代码 // [ClassCleanup()] // public static void MyClassCleanup() { } [TestMethod] public void TestMethod1() { // 在此加入测试逻辑 } }
朱优良
单元测试基本概念 Visual Studio 2010 单元测试实例 单元测试技巧
测试驱动开发流程
课后实战
2
按开发阶段分Biblioteka Baidu
◦ 单元测试、集成测试、系统测试、验收测试
按测试技术分
◦ 白盒测试、黑盒测试、灰盒测试
按实施主体分
◦ 开发方测试、用户测试、第三方测试
按执行状态分
◦ 动态测试、静态测试
11
针对Search类建立测试类SearchTest,标记为 [TestClass] 针对BubbleSort方法建立测试方法BubbleSortTest,标 记为[TestMethod] 一个测试用例主要包括输入参数和输出结果,以及实际输 出结果和预计结果的比较
12
8
类
方法
测试步骤
预期结果
Search BubbleSort Search BubbleSort
1. 准备输入数组{ 1, 5, 13, 6,数组 { 1, 2, 5, 6, 10, 10, 55, 99, 2, 87, 12, 12, 13, 33, 34, 47, 55, 75, 87, 99 } 34, 75, 33, 47 } 2. 执行方法
13
通过“测试”菜单进入“测试清单编辑器”
选择测试名称,点击“执行核取的测试”按钮,执 行测试。 单元测试过程同样可以单步调试。
14
测试用例执行的同时会显示“测试结果”
测试结果分“成功”和“失败”两种。
◦ 失败1:测试方法 BinarySearchTest 掷回例外状况: ... ◦ 失败1:Assert.AreEqual 失败。预期: <1>。实际: <-1>
首先在菜单“测试” 中选择“编辑测试设 定”,如右图:
勾选“程序代码涵盖 范围”,点击“设定 ”。勾选要测试的成 品,如右图:
17
Visual Studio自动计算的测试覆盖为语句覆盖
18
单元测试针对局部代码,功能测试可能针对整体系 统系统
◦ 与本程序相关的其他程序还没有完成。 ◦ 有些模块是用户不可见的 ◦ 单元测试无法测非功能性要求,功能测试难以满足足够的 条件
单元测试目的在于确认代码是否满足设计要求,功 能测试目的在于确认系统是否满足用户需求
◦ 程序是否按照设计的架构要求来编写,如数据访问? ◦ 同样的功能可以有不同的设计,如发送邮件是否实时?
19
◦ 所有程序代码全部都至 少执行一次 ◦ 所有的逻辑判定都至少 取“真”和“假”一次 ◦ 在循环的边界和循环体 内执行 ◦ 数据结构的有效性 ◦ 。。。
21
Stub
◦ 为了开发好A,我们用一个 临时替代方法的“桩”配 合A的开发和调试过程。桩 方法只需要同样的参数, 以及对参数的判断,幷返 回虚假的结果。
public class MockCardReader { public bool CheckOnline() { return true; } public void ReadCard(string path) { ; } public void SaveToDB () { ; }
3
它浪费了太多的时间? 它仅仅是证明这些代码做了什么? 不管怎样, 系统测试将会抓住所有的Bug? 成本效率不高?
修改缺陷的代价
需求 设计 编码 测试 上线
4
1.不要让你的客户发现令人尴尬的bug。编写单元测试能让你覆盖大 部分的应用案例,并且发现常见的问题。 2.感觉更安全。通过反复的测试,你在添加新功能的时候不会影响程 序已有的功能。 3.避免写不必要的代码。这样可以让代码更简洁,更容易维护,同时 也节省开发时间。 4.具有回归性。你不用为相同的代码重复的进行测试。 5.保证代码的可读性。单元测试能让你代码的目的性和逻辑性更容易 被理解。 6.保证代码的可维护性。单元测试能强制让你对功能进行封装。 7.无忧的进行重构。在你重构以后,跑一遍测试,你就知道重构是否 对程序的功能造成了破坏。 8.节省测试的时间。测试是自动进行的,速度的快慢取决于你的CPU 。
public void ReadData() { CardReader reader = new CardReader(); foreach (DevInfo dev in DevInfoList) { // 检验卡钟是否在线 if (reader.CheckOnline()) { // 读取卡钟数据 reader.ReadCard(targetPath); // 将数据保存到数据库 reader.SaveToDB(); } } }
20
◦ 方法A调用方法B,现在 测试方法A,但方法B比 较耗时,或者无法直接 支持调试器,或者需要 发生实际费用,或者还 根本没有开发出来。 ◦ 比如发送邮件、发送短 信、向其他系统(SAP, 中央人事数据库)抛砖 数据等
public void ReadData() { CardReader reader = new CardReader(); foreach (DevInfo dev in DevInfoList) { // 检验卡钟是否在线 if (reader.CheckOnline()) { // 读取卡钟数据 reader.ReadCard(targetPath); // 将数据保存到数据库 reader.SaveToDB(); } } }