理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这 些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏的很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员 当初设计测试用例时真正的目的,它们的测试点事希望测试出被测代码中别的出错地方。

比如,一个测试用例运行的 locale(如:Locale.US)与之前开发人员设计该测试用例时所设想的不同(如:Locale.UK),这样会导致测试不通过,但是这可能并不是开发人员之前设计测试用例时所设想的测试出来的有用的失败结果(测试点并不是此,比如测试的真正目的是想判断函数的返回值是否为true,返回false 则测试失败),这时开发人员可以通过编写一些额外的代码来消除这些影响(比如将 locale 作为参数传入到测试用例中,每次运行测试用例时,明确指定 locale),但是花费时间和精力来编写这些不是测试用例根本目的的额外代码其实是种浪费,这时就可以使用 Assumption 假设机制来轻松达到额外代码的目的。编写该测试用例时,首先假设 locale 必须是Locale.UK,如果运行时 locale 是Locale.UK,则继续执行该测试用例函数,如果是其它的 locale,则跳过该测试用例函数,执行该测试用例函数以外的代码,这样就不会因为 locale 的问题导致测试出错。

JUnit 4.4提供了assumeThat语句,开发人员可以使用合适的Matcher来设计所有的假设条件。为了方便,JUnit 4.4还提供了assumeTrue,assumeNotNull和assumeNoException语句。

假设机制的优点:

1.通过对 runtime 变量进行取值假设,从而不会因为一个测试用例的不通过而导致整个测试失败而中断(the test passes),使得测试更加连贯。

开发人员编写单元测试时,经常会在一个测试中包含若干个测试用例函数,这时若是遇到某个测试用例函数不通过,整个单元测试就会终止。这将导致测试不 连贯,因为开发人员往往希望一次能运行多个测试用例函数,不通过的测试用例函数不要影响到剩下的测试用例函数的运行,否则会给 debug 调试带来很大的难度。

开发人员编写单元测试时,有时是预测不了传入到单元测试方法中的变量值的,而且这些值有时并不是开发人员所期望的,因为他们会导致测试用例不通过并 中断整个测试,所以开发人员需要跳过这些导致测试用例函数不通过的异常情况。默认的JUnit runner会忽略假设失败的测试。

import static org.hamcrest.Matchers.*;
import static org.junit.Assume.*;
import java.io.File;
import org.junit.Test; public class AssumeTest {
@Test
public void test1(){
//"DEV" default is 'null'
assumeThat(System.getProperty("DEV"),nullValue());
System.out.println("Assumption is true!");
}
@Test
public void test2() {
//File.separatorChar default is '\'
assumeThat(File.separatorChar, is('/'));
System.out.print("hello");
}
}

运行结果显示:

Assumption is true!

Runs: 2/2 (1 skipped)

由于test1的假设与实际符合,所以继续运行并且pass。而test2的假设与实际不符合,所以跳过test2继续运行,但是test2不会被标记为fail,它只是被忽略了。
2.利用假设机制可以控制某个测试用例运行环境,让其在自己期望的时候运行。比如说test1,它只在“DEV”为空的时候会运行。不为空的话直接跳过。

使用假设机制需要注意:

使用assumeXXX,必须 import static org.junit.Assume.*;
使用hamcrest的匹配库,必须 import static org.hamcrest.Matchers.*; 或者 import static org.hamcrest.CoreMatchers.*; 。
在一个测试中,即使假设不正确,假设之前的语句也会被执行,程序会在执行假设语句的时候直接跳出,然后该测试pass。
@Before或者 @BeforeClass中的不正确假设,也会导致整个测试在执行假设语句的时候直接跳出,然后该测试pass。

Assumptions的更多相关文章

  1. JUnit5学习之二:Assumptions类

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations

    目录 概 主要内容 Locatello F., Bauer S., Lucic M., R"{a}tsch G., Gelly S. Sch"{o}lkopf and Bachem ...

  3. 机器学习---最小二乘线性回归模型的5个基本假设(Machine Learning Least Squares Linear Regression Assumptions)

    在之前的文章<机器学习---线性回归(Machine Learning Linear Regression)>中说到,使用最小二乘回归模型需要满足一些假设条件.但是这些假设条件却往往是人们 ...

  4. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  5. spring源码分析之<context:property-placeholder/>和<property-override/>

    在一个spring xml配置文件中,NamespaceHandler是DefaultBeanDefinitionDocumentReader用来处理自定义命名空间的基础接口.其层次结构如下: < ...

  6. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)

    一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr.其中它是在名字 ...

  7. Mono+Jexus部署C# MVC的各种坑

    如果你看到这篇文章,先别急着动手,过完一遍,确定是你要的再动手. 别人提到的这里不赘述,只说查了好久才知道的. 1号坑:System.IO.FileNotFoundException Could no ...

  8. EasyPR--开发详解(8)文字定位

    今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...

  9. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

随机推荐

  1. 关于SQL IO的一些资料

      前些天在做优化的时候发现一个有意思的现象,单纯的SQL执行很快,秒级返回,但是页面响应却很慢,一直在想这是为什么呢?有点怀疑服务器的IO有问题,想了想做了个实验,模拟了同样的场景,通过优化SQL将 ...

  2. Oracle主键自动生成_表and存储过程

    -- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...

  3. 开发自己的cordova插件

    如果还没有配置过cordova环境,首先要下载nodejs,(下载地址https://nodejs.org/)下载完毕安装. 控制台: 1.输入npm -v 确定是否装上了 2.输入sudo npm ...

  4. 平衡搜索树(二) Rb 红黑树

    Rb树简介 红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black.通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍, ...

  5. Android开发系列----学习伊始

    因为对移动端开发开始感兴趣,开始学习App开发,没有苹果环境的我,只好先选择Android来玩一玩了~~ 找了一套视频,买了几本java.android开发的书,开始搞起~~

  6. Linux下ln链接命令详解

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  7. Easyui的combobox组件无法选择内容

    我切换combobox的内容的时候,老是选中的是第一行的数据,因为我渲染的时候没有给它valueField和textField的字段,而默认的又不是我要求的. 加上就好了. $("#tool ...

  8. 传值 UI考试知识点

    传值: 1. 属性传值:从前往后 2. 代理传值:从后往前 3. block: 4. 单例:普通写法和GCD写法 5 . 通知 NSNotification GCD 单例: static PlayMu ...

  9. 发送邮件(E-mail)方法整理合集

    在IOS开发中,有时候我们会需要用到邮件发送的功能.比如,接收用户反馈和程序崩溃通知等等.其实这个功能是很常用的,因为我目前就有发送邮件的开发需求,所以顺便整理下IOS发送邮件的方法. IOS原生自带 ...

  10. LeapMotion预览——什么是LeapMotion

    LeapMotion预览 这个就是LeapMotion: 原文转自:   LeapMotion预览 LeapMotion 官网:http://leapmotion.com/ 开发者:https://d ...