单元测试的方法

单元测试的两种方式

在单元测试中,可通过两种方式来验证代码是否正确地工作。一种是基于结果状态的测试,一种是基于交互行为的测试。

测试结果与测试行为之间有什么区别呢?

基于结果状态的测试,也就意味着我们需要验证被测试代码需要返回正确的结果。

 1     [TestMethod]
 2     public void TestSortNumberResult()
 3     {
 4       IShellSorter<int> shellSorter = new ShellSorter<int>();
 5       IBubbleSorter<int> bubbleSorter = new BubbleSorter<int>();
 6
 7       NumberSorter numberSorter = new NumberSorter(shellSorter, bubbleSorter);
 8       int[] numbers = new int[] { 3, 1, 2 };
 9       numberSorter.Sort(numbers);
10
11       // 验证返回值是否已经被正确排序。
12       // 只要返回值正确即可,并不关心使用了哪个算法。
13       CollectionAssert.AreEqual(new int[] { 1, 2, 3 }, numbers);
14     }

基于交互行为的测试,也就意味着我们需要验证被测试代码是否正确合理地调用了某些方法。

 1     [TestMethod]
 2     public void TestUseCorrectSortingAlgorithm()
 3     {
 4       IShellSorter<int> mockShellSorter = Substitute.For<IShellSorter<int>>();
 5       IBubbleSorter<int> mockBubbleSorter = Substitute.For<IBubbleSorter<int>>();
 6
 7       NumberSorter numberSorter = new NumberSorter(mockShellSorter, mockBubbleSorter);
 8       int[] numbers = new int[] { 3, 1, 2 };
 9       numberSorter.Sort(numbers);
10
11       // 验证排序器是否使用冒泡排序算法。
12       // 如果排序器未使用冒泡排序算法,或者使用了该算法但传递了错误的参数,则验证失败。
13       mockBubbleSorter.Received().Sort(Arg.Is<int[]>(numbers));
14     }

第二种测试方法可能会得出较好的代码覆盖率,但它却没有告诉我们排序结果是否正确,而只是确认调用了 bubbleSorter.Sort() 方法。所以交互行为测试并不能证明代码可以正确工作。这也就是在大多数情况下,我们需要测试结果和状态,而不是测试交互和行为。

通常来说,如果程序的正确性不能仅仅靠程序的输出结果来决定,而还需要判断结果是怎么产生的,在这种条件下,我们就需要对交互和行为进行测试。在上面的示例中,你可能想在得到正确测试结果的前提下,额外的再测试下交互行为,因为可能确认正确地使用了某种算法非常重要,例如某些算法在给定条件下运行速度更快,否则的话测试交互行为的意义并不大。

通常在什么条件下需要对交互行为进行测试呢?

这里给出两种较适合的场景:

  • 假设被测试代码需要调用了一个方法,但可能由于其被调用的次数不同,或者被调用的顺序不同,而导致产生了不同的结果,或者出现了其他类似时间延迟、多线程死锁等副作用。例如该方法负责发送邮件,我们需要确认只调用了一次邮件发送函数。或者例如该方法的不同调用顺序会产生不同的线程锁控制,导致死锁。在类似这些情况下,测试交互行为可以有效地帮助你确认方法调用是否正确。
  • 假设我们在测试一个UI程序,其中已经通过抽象将UI渲染部分与UI逻辑部分隔离,可以考虑是某种MVC或MVVM模式。那么在我们测试 Controller 或 ViewModel 层时,如果有的话,可能只关心 View 上的哪些方法被调用了,而并不关系具体该方法内部是如何渲染的,所以此处测试与 View 的交互就比较合适。类似的,对于 Model 层也一样。

转载地址:

http://www.cnblogs.com/gaochundong/archive/2013/06/05/ut_test_state_or_test_interaction.html

http://www.cnblogs.com/gaochundong/archive/2013/05/22/nsubstitute_manual.html

时间: 2025-01-04 14:57:56

单元测试的方法的相关文章

配置PHP单元测试的方法实例

这篇文章主要介绍了PHP单元测试配置与使用方法,结合实例形式详细分析了PHP单元测试的具体安装.配置.使用方法及相关操作注意事项,需要的朋友可以参考下本文实例讲述了PHP单元测试配置与使用方法.分享给大家供大家参考,具体如下:php与其他语言不太一样,单元测试需要自己安装和配置,相对麻烦一点,不过单元测试对于提高库的稳定性和健壮性还是非常给力的,下面教大家怎么配置PHP单元测试注意:php需升级到7.1版本以上配置说明1.全局安装phpunit命令脚本 $ wget https://phar.p

一种对软件模块进行单元测试的方法

      [文章摘要] 在软件的开发阶段,单元测试是确保代码质量的重要方法.因此,掌握基本的单元测试方法是对一个软件开发人员的基本要求. 本文基于作者的实际项目经历,介绍了一种采用得比较多的单元测试方法.         一.软件模块概述 在实际的软件系统中,各个模块之间的关系可以用错综复杂来形容.根据模块之间有无消息交互,可以将软件模块划分为以下四类. 第一类:独立模块.即该模块不接收其它模块发过来的消息,同时也不向其它模块发消息. 第二类:被动的单向消息模块.即该模块只接收其它模块发过来的

单元测试中方法运行测试和调试测试不起作用原因

1.方法上右键运行测试和调试测试不起作用代码: 1 #region 我的相册 2 /// <summary> 3 /// 我的相册 4 /// </summary> 5 /// <param name="currIndex"></param> 6 /// <param name="PageSize"></param> 7 [TestMethod] 8 public void MyPicList(

cakephp 单元测试断言方法总结

前言 cakephp 的单元测试 参考http://book.cakephp.org/2.0/en/development/testing.html 以下是CakeTestCase类的断言,也就是cakephp 定义的断言,实际使用中还可以使用CakeTestCase的父类 PHPUnit_Framework_TestCase里面的断言 1.assertEqual 是否相等,测试期望的数据和结果是否相等 2.assertNotEqual 是否不相等 3.assertPattern 是否符合正则匹

教你如何编写Vue.js的单元测试的方法

Vue.js是一个JavaScript框架,可用于构建Web应用程序的前端框架.特别是在创建复杂功能时,对于每个项目,有必要在我们的应用程序中查看所有内容,并检查它是否符合预期.然而,对于大型项目,每次新的更新后,检查每个功能将变得很麻烦.因此,我们可以创建可以一直运行的自动化测试,并保证我们的代码可以正常运行.在本文中,我们将为VueJS创建一些简单的单元测试. 要进行测试,我们将先制作一个基本的待办事项列表组件.我们将测试该列表是否正确显示,并且用户可以将新项目添加到待办事项列表中.希望在本

单元测试 全局方法列表

看代码吧 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace P2P.Tests { [TestClass()] public sealed

作业8:单元测试练习

[必做题1] 针对附录1给出的三角形判断Java 代码,应用等价类划分法设计测试用例,用表格形式列出设计的测试用例,写到博客中. 测试用例     序号 测试输入:三条边(a,b,c) 测试预言(Oracle:直角.等腰.等边三角形) 1 输入(3,3,3) 等边三角形 2 输入(3,2,4) 不等边三角形 3 输入(3,2,2) 等腰三角形 [必做题2] 模仿附录2给出的三角形判断Junit测试代码,设计单元测试脚本,测试 [必做题1]设计得到的测试用例.注意测试脚本中测试用例出现顺序与[必做

Junit(1)在Eclipse中使用JUnit4进行单元测试

我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这 一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试. 传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在

在Eclipse中使用JUnit4进行单元测试(初级篇)

转载自:http://blog.csdn.net/andycpp/article/details/1327147/ 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数的方方面面进