JUnit注解与hamcrest

简介:

黑盒测试:

黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。说白了黑盒测试就是不需要知道程序的代码结构,只需要类似于充当用户那样去使用。

所以黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。

 

白盒测试:

白盒测试[1]  又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。

采用什么方法对软件进行测试呢?常用的软件测试方法有两大类:静态测试方法和动态测试方法。其中软件的静态测试不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试;而软件的动态测试是通过输入一组预先按照一定的测试准则构造的实例数据来动态运行程序,而达到发现程序错误的过程。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。

白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、路径覆盖和程序变异。

白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖判定覆盖条件覆盖、判定/条件覆盖、条件组合覆盖路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:

1.语句覆盖每条语句至少执行一次。

2.判定覆盖每个判定的每个分支至少执行一次。

3.条件覆盖每个判定的每个条件应取到各种可能的值。

4.判定/条件覆盖同时满足判定覆盖条件覆盖。

5.条件组合覆盖每个判定中各条件的每一种组合至少出现一次。

6.路径覆盖使程序中每一条可能的路径至少执行一次。

 

由上可知,白盒测试对于测试人员来说技术要求较高,一般只有比较严格的大项目才会使用白盒测试,白盒测试成本也大,所以一般大多数情况下是程序员自己进行简单的白盒测试。

 

JUnit注解:

我们都知道JUnit4是使用注解的方式来对方法进行测试的,而这些注解都是分开进行测试的,就像线程一样,每在一个方法上添加一个注解,就像是开启一个线程去测试这个方法,所以一个注解一个分支,多个注解多个分支:

87c31c86d2dc7c00934bd43e059ea0ee.png




@Before@After注解:

@Before的作用是在JUnit测试之前会调用写有@Before注解的方法。@After的作用则相反,是在JUnit测试结束后调用写有@After注解的方法。有一点要注意的是:这里所说的测试是指每一个写有@Test注解的方法,也就是每个分支都是一个JUnit测试,每个分支测试在开始前会调用写有@Before注解的方法,结束则调用@After注解的方法,例如我写了3个测试的话,就会调用写有@Before的方法3次,调用写有@After的方法3次。

代码示例:

84726602c1ec937397fbad04ebabc2ae.png


运行结果:

a41fd3d8bd2cab6716627aa651e9aab2.png


@Test注解里加上expected,是用来测试方法有没有抛出应该抛出的异常的,也就是专门测试异常发生的,如果没有抛出相应的异常,就表示这个方法是有问题的,JUnit的测试结果就会报出错误。

错误代码示例:

5ac0f2ce5b82e4b1bb12f202a97a2716.png


运行结果:

7cebd9cefce1b7e1d326a0ff3a6c5748.png


正确的代码示例:

f772ca4b20266a7797a3c75bdc3362a3.png


运行结果:

f2dc4f976bfd0fe342e9ca9ab27205be.png



@Test注解里加上timeout,是用于测试方法运行的时间有没有超过所设定的时间,如果没超时则测试的结果是正确的,超时了自然测试结果就是错误的。

错误代码示例:

2f531305182e5b51965adff4e36ff55c.png


运行结果:

0fb6fc2708e51251d7cf0774775f3799.png


正确代码示例:

17b9a323a2ecbe5e734180e427acfa34.png


运行结果:

0e07a5cddb1aa45e8be959fcbd0e2171.png



@RunWith@SuiteClasses是用来统一运行多个测试类的,把写有测试注解的类加入到@SuiteClasses中,就可以将这些类统一的进行运行,这个过程只需要运行写有@RunWith@SuiteClasses的类即可,测试类不需要运行。

 

代码示例:

b212d3b6dc39ae1f94a0d3e3d51be801.png


运行结果:

c5237d4d5a1584905714b5425106f674.png



Assert

AssertJUnit里的一个工具类,这个类里面的方法能够给我们提供类似于判断语句一样的效果。

  assertTrue/assertFalse方法:

aac817f62fe635b643bebecd23cb31f0.png


assertArrayEquals方法:

b2bd4df0d40d04d2d58fba343632399b.png

这个方法是用来比较两个数组对象是否一致的,这个方法的参数类型有很多种,可以比较8种基本数据类型的数组和Object类型的数组,而且也能在方法参数里加一个字符串,这个字符串可以在测试结果报错时被打印出来,下面用boolean数组做一个示例:

ec53adfc3c7b631f5326a50c9eeec354.png


运行结果:

4ae490fd46a1abb82aca12812a503bf3.png


assertEquals方法:

720575b0764ca58539236609a6ef054a.png



这个方法主要是用来比较两个变量是否相同的,同样的可以比较8种基本数据类型的变量和Object数组对象,而且也能在参数中加字符串,以下以int类型和Object数组做一个示例:

9cffc10d8104db731d5bab3b3bb75906.png


运行结果:

c6ba4c95e401b8e094756d6fd99d953e.png


assertNotEquals方法:

718ce978ad2b4e059fe3ff36445a36b7.png

这个方法是用来比较两个变量是否是不相同的,不相同则没问题,相同则会报错,可以比较long、double、float基本数据类型和Object类型对象,同样的可以在参数里加上一个字符串,下面以long类型和Object类型做一个示例:

b85810eaca779c6431f9f64eccb112ec.png


运行结果:

22bd570be2723f16807dea4f4256997e.png


assertNotNull方法:

138febf000633d62040ff4089fa87889.png



这个方法是用来判断Object类型的对象是否为不为空的,不为空则没问题,为空则报错,同样的可以在参数里加上一个字符串。

代码示例:

91918215ca5fa589ac601e3b2185c54a.png


运行结果:

a940f9437c77f8d1b8512a6e2d3de284.png



assertSame  方法:

此方法用于比两个Object对象内存地址是否一致,不一致则会报错:

d57ed8c3aca5c1b9f0dbf86fdc07ded6.png



fail方法:

  这个方法是专门用来输出错误信息的,只要写了这个方法,不管测试用例本身是否正确,测试的结果都是错误的:

33904f3ab2e8ee85699327c7e9a8de24.png



hamcrest

  hamcrest包里的方法可以让Assert升级成类似于多路分支的判断语句就像if esle差不多,一般下载JUnit4以上的版本都会自带这个包。

df0d73d9ed96c1904f219e670198067d.png




核心

anything - 总是匹配,如果你不关心测试下的对象是什么是有用的

describedAs - 添加一个定制的失败表述装饰器

is - 改进可读性装饰器 - 见下 “Sugar”

逻辑

allOf - 如果所有匹配器都匹配才匹配, short circuits (很难懂的一个词,意译是短路,感觉不对,就没有翻译)(像 Java &&)

anyOf - 如果任何匹配器匹配就匹配, short circuits (像 Java ||)

not - 如果包装的匹配器不匹配器时匹配,反之亦然

对象

equalTo - 测试对象相等使用Object.equals方法

hasToString - 测试Object.toString方法

instanceOf, isCompatibleType - 测试类型

notNullValue, nullValue - 测试null

sameInstance - 测试对象实例

Beans

hasProperty - 测试JavaBeans属性

集合

array - 测试一个数组元素test an array’s elements against an array of matchers

hasEntry, hasKey, hasValue - 测试一个Map包含一个实体,键或者值

hasItem, hasItems - 测试一个集合包含一个元素

hasItemInArray - 测试一个数组包含一个元素

数字

closeTo - 测试浮点值接近给定的值

greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - 测试次序

文本

equalToIgnoringCase - 测试字符串相等忽略大小写

equalToIgnoringWhiteSpace - 测试字符串忽略空白

containsString, endsWith, startsWith - 测试字符串匹配

 

 

 

Assert.assertThat("表达式判断不通过", true, is(true));

Assert.assertThat("表达式判断不通过", "asd", IsNull.notNullValue());

Assert.assertThat("表达式判断不通过", "Hello.java", allOf(endsWith(".java"), startsWith("Hello")));

Assert.assertThat("表达式判断不通过", "Hello.java", anyOf(endsWith(".java"), startsWith("Hello")));

 

  代码示例:

03968e5555487ba8785d50bdd8de511d.png




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976742,如需转载请自行联系原作者

相关文章
|
3月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
2月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
5月前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
38 0
|
Java 测试技术 Maven
JUnit5学习之五:标签(Tag)和自定义注解
学习和实践JUnit5的标签过滤和自定义注解功能
120 1
JUnit5学习之五:标签(Tag)和自定义注解
JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
导入了Junit依赖,但@Test注解依然爆红~
导入了Junit依赖,但@Test注解依然爆红~
148 0
|
Java 数据库 Spring
Spring Boot 学习研究笔记(四) -Junit 5 中注解特性
Spring Boot 学习研究笔记(四) -Junit 5 中注解特性
|
Java 测试技术
单元测试_JUnit常用单元测试注解介绍及代码演示 2
单元测试_JUnit常用单元测试注解介绍及代码演示
130 0
|
Java 测试技术 数据库连接
单元测试_JUnit常用单元测试注解介绍及代码演示 1
单元测试_JUnit常用单元测试注解介绍及代码演示
163 0
|
Java Spring 容器
Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述(二)
Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述
169 0
Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述(二)