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

比如,一个测试用例运行的 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. 我的第一个boke

    哈哈哈 接口

  2. C++中extern关键字使用(转)

    参考文章:http://blog.csdn.net/sruru/article/details/7951019 chapter1.如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写 ...

  3. Linux(Debian)下Maven的安装

    Maven的下载地址:http://maven.apache.org/download.cgi这里以最新的3.3.9版本为例进行安装,在这之前需要确保机器上已经安装了JDK. -- 在home文件夹中 ...

  4. 如何用angularjs制作一个完整的表格之五__完整的案例

    由于本人也是边学边写,因此整理的比较乱,下面放出我例子的完整代码,方便大家交流测试,如有问题欢迎评论 首先,表格采用的是BootStrap样式编辑的,主要使用的是angularjs,为了方便也有jQu ...

  5. ICE学习第一步-----配置ICE环境变量

    安装 ICE: 1.下载ICE: http://www.zeroc.com/download.html 下载说明:ICE支持语言(C++, Java, C#, Visual Basic,Python, ...

  6. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  7. python自动开发之(ajax)第二十天

    1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...

  8. 去除VS2010中中文注释下的红色波浪线

    1,中文注释以分号结尾 2,Assist X 菜单栏->Assist X Option->Underline 选择“min”.

  9. iOS触摸事件处理--备用

    主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在视图的层次结构里找到能响应消息的那个视图.(2)然后在找到的视图里处理消息 ...

  10. BZOJ 2423 最长公共子序列

    Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0, ...