.NET单元测试艺术(2) - 第一个单元测试
List 2.1 使用[SetUp]和[TearDown]特性
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace AOUT.LogAn.Tests { [TestFixture] public class LogAnalyzerTests { private LogAnalyzer _analyzer = null; [SetUp] public void Setup() { _analyzer = new LogAnalyzer(); } [Test] public void IsValidLogFileName_ValidFileLowerCased_ReturnsTrue() { bool result = _analyzer.IsValidLogFileName(@"C:\Work\Microsoft\ArtOfUnitTesting\whatever.slf"); Assert.IsTrue(result, "filename should be valid!"); } [Test] public void IsValidLogFileName_ValidFileUpperCased_ReturnsTrue() { bool result = _analyzer.IsValidLogFileName(@"C:\Work\Microsoft\ArtOfUnitTesting\whatever.SLF"); Assert.IsTrue(result, "filename should be valid!"); } [TearDown] public void TearDown() { _analyzer = null; } } }
List 2.2 我们希望测试的LogAnalyzer文件名验证逻辑
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace AOUT.LogAn { public class LogAnalyzer { public bool IsValidLogFileName(string fileName) { if (!File.Exists(fileName)) { throw new Exception("No log file with that name exists"); } if (!fileName.ToLower().EndsWith(".slf")) { return false; } return true; } } }
List 2.3 通过调用IsValidLogFileName来测试属性的值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace AOUT.LogAn { public class LogAnalyzer { private bool _wasLastFileNameValid; public bool WasLastFileNameValid { get { return _wasLastFileNameValid; } set { _wasLastFileNameValid = value; } } public bool IsValidLogFileName(string fileName) { if (!fileName.ToLower().EndsWith(".slf")) { _wasLastFileNameValid = false; return false; } // Save status for later valid _wasLastFileNameValid = true; return true; } } }
List 2.4 通过调用调用方法并检查其属性值来测试一个类
[Test] public void IsValidLogFileName_ValidName_RemembersTrue() { LogAnalyzer log = new LogAnalyzer(); log.IsValidLogFileName("somefile.slf"); Assert.IsTrue(log.WasLastFileNameValid); }
List 2.5 Add()方法和Sum()方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AOUT.LogAn { public class Calculator { ; public void Add(int number) { _sum += number; } public int Sum() { int temp = _sum; _sum = ; return temp; } } }
List 2.6 针对Calculator的Sum()方法的最简单测试
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace AOUT.LogAn.Tests { public class CalculatorTests { [Test] public void Sum_NoAddCalls_DefaultsToZero() { Calculator calc = new Calculator(); int lastSum = calc.Sum(); Assert.AreEqual(, lastSum); } } }
List 2.7 两个测试,其中第二个调用了Add()方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace AOUT.LogAn.Tests { public class CalculatorTests { private Calculator _calc = null; [SetUp] public void Setup() { _calc = new Calculator(); } [Test] public void Sum_NoAddCalls_DefaultsToZero() { int lastSum = _calc.Sum(); Assert.AreEqual(, lastSum); } [Test] public void Add_CalledOnce_SavesNumberForSum() { _calc.Add(); int lastSum = _calc.Sum(); Assert.AreEqual(, lastSum); } } }
.NET单元测试艺术(2) - 第一个单元测试的更多相关文章
- [Test] 单元测试艺术(1) 基础知识
单元测试不是软件开发的新概念,在1970年就一直存在,屡屡被证明是最理想的方法之一. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,测试框架 创建优秀的单元测试 本节索引: 单 ...
- [Test] 单元测试艺术(2) 打破依赖,使用模拟对象,桩对象,隔离框架
在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破 ...
- 单元测试系列之三:JUnit单元测试规范
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...
- <VS2017> 编写VC++单元测试 -(一)新建单元测试工程
开发人员自己编写单元测试是一个非常好的习惯.单元测试不但能够验证自己所编写的代码是否存在问题,避免提交给测试人员时才发现bug,也可以为将来改动代码的人提供验证代码功能正确性的途径.在我有限的工作生涯 ...
- .NET单元测试艺术(1) - 单元测试的基本知识
List 1.1 一个要测试的SimpleParser类 using System; namespace AOUT.CH1.Examples { public class SimpleParser { ...
- .NET单元测试艺术(3) - 使用桩对象接触依赖
List 3.1 抽取一个设计文件系统的类,并调用它 [Test] public bool IsValidLogFileName(string fileName) { FileExtensionMan ...
- 单元测试或main方法 进行单元测试时 idea检查其他类的语法是否正确的去除方法
在进行单元测试或者main方法时,在 运行/调试 设置中设置想要使用的测试单位的 before launch 即可
- linux内核设计的艺术--系统启动第一步
计算机究竟是如何执行起来的呢,在我学习计算机的时候一直不是非常明确,可是近期借了本<linux内核设计的艺术>算是知道了计算机从按开机到启动操作系统之间究竟做了些什么. 这本书刚開始介绍的 ...
- 【maven】【spring boot】【单元测试】 使用controller 执行单元测试类
存在这样一个场景: 当项目启动时间过长,又没办法缩短的时候,写单元测试就是一个十分耗时的工作, 这工作不在于使用编写代码,而在于每次run junit test 都需要完整启动一次项目,白白浪费宝贵的 ...
随机推荐
- DRY
DRY(Don't Repeat Yourself )原则 凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类 ...
- I深搜
<span style="color:#330099;">/* I - 深搜 基础 Time Limit:1000MS Memory Limit:10000KB 64b ...
- Ubuntu14.04 用 CrossOver 安装 TMQQ2013
Crossover 是 wine 的优化+商业版本号 , 免去了wine的繁琐配置,让Ubuntu安装windows软件很easy..... 部分移植的软件还有官方的维护,执行效果也比較好..... ...
- msyql在查询字段中的所有记录,不重复
mysql> select * from a ; +----+------+--------------+ | id | name | descri | +----+------+ ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- Asp.net
视频摘要
Asp.net一遍又一遍视频最近,例如中,大多数的实现.由于原因的版本号,.当然学过是学过.总结不可缺少. 先宏观后微观.刚学完,感觉知识特别乱,所以先画了张图: watermark/2/text/a ...
- Sliverlight实例之 使用 ControlTemplate 自定义按钮的外观
按钮,最终效果,如下图: 见Project21_ButtonSkin 1, 创建Sliverlight项目 说明: generic.xaml:样式和模板就被定义在这个文件里 MyButton.cs:控 ...
- Linux 下开启ssh服务(转)
二.SSH SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目 ...
- Maximal Square 我们都在寻找最高1子矩阵(leeCode)
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...
- c++分割字符串(类似于boost::split)
由于c++字符串没有split函数,所以字符串分割单词的时候必须自己手写,也相当于自己实现一个split函数吧! 如果需要根据单一字符分割单词,直接用getline读取就好了,很简单 #include ...