赞
踩
目录
1.2.2.2 @Suite.SuiteClasses(...{xx.class, xx.class, ...})
1.2.3.1 @RunWith(Parameterized.class)
1.2.5.2 JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule
前面我们介绍了白盒测试方法,后面我们来介绍一下Junit 4,使用的是eclipse(用IDEA的小伙伴可以撤了)
我们需要三个jar包:
org.junit_4.13.2.v20211018-1956.jar和org.hamcrest.core_1.3.0.v20180420-1519.jar这两个jar包是eclipse自带的
然后我们需要下一个org.hamcrest-library-1.3.jar
点击 new >> New >> Project
选择Java Project 点击next
输入项目名,选择jre,点击next
选择 Libraries >> Classpath >> Add Extemal JARs
选择之前我们的三个jar包,一般放在eclipsed的plugins目录,org.hamcrest-library-1.3.jar则在自己下载的目录(可以把下载下来的jar包也丢这里),点击Finish
我们新建一个文件夹存放junit代码
新建一个项目
编写Demo.java代码:
- public class Demo {
- public int add (int a, int b) {
- return a + b;
- }
- public int div (int a, int b) {
- return a / b;
- }
- }
右键项目,new一个,这里没有junit,我们去其他里面找
在java下的junit,选择Test Case,点击next
选择junit4,选择目录到我们刚刚建的junit文件夹,选择Finish
在DemoTest.java中输入代码:
- import static org.junit.Assert.*;
-
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
-
- public class DemoTest {
-
- Demo demo;
-
- @Before
- public void setUp() throws Exception {
- demo = new Demo();
- }
-
- @After
- public void tearDown() throws Exception {
- demo = null;
- }
-
- @Test
- public void testAdd() {
- // 实例化一个类
- Demo demo = new Demo();
- // 期望值
- int expetected = 2;
- // 真实值
- int trueValue = demo.add(1, 1);
- // 断言方法
- assertEquals(expetected, trueValue);
- }
-
- @Test
- public void testDiv() {
- // 实例化一个类
- Demo demo = new Demo();
- // 期望值
- int expetected = 2;
- // 真实值
- int trueValue = demo.div(2, 1);
- // 断言方法
- assertEquals(expetected, trueValue);
- }
-
- }
运行
- public void setUp() throws Exception {
- // 初始化所需的资源
- }
在每个测试方法之前执行,用以初始化需要初始化的资源
- @After
- public void tearDown() throws Exception {
- // 关闭资源
- }
在每个测试方法之后执行,用以关闭需要初始化的资源
- @BeforeClass
- public static void setup() throws Exception {
- // 初始化资源
- }
在所有方法执行之前执行,一般被用作执行计算代价很大的任务,如打开数据库连接。被@BeforeClass 注解的方法应该是静态的(即 static类型的)。
- @AfterClass
- public static void tearDown() throws Exception {
- // 关闭资源
- }
在所有方法执行之后执行,一般被用作执行类似关闭数据库连接的任务。被@AfterClass 注解的方法应该是静态的(即 static类型的)。
- @Test
- public void test01() {
- // 测试,断言等
- }
包含了真正的测试代码,并且会被Junit应用为要测试的方法。
@Test注解有两个可选的参数:
注释掉一个测试方法或者一个类,被注释的方法或类,不会被执行。
注意:JUnite4的执行顺序:@BeforeClass > @Before > @Test1 > @After > @Before > @Test2 > @After ...... > @AfterClass
- import static org.junit.Assert.*;
-
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
-
- public class DemoTest {
-
- @BeforeClass
- public static void setup() throws Exception {
- // 这里初始化资源(如连接数据库)
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- // 关闭资源()
- }
-
- @Before
- public void setUp() throws Exception {
- System.out.println("SetUp.....");
- // 这里初始化我们所需要的资源
- }
-
- @After
- public void tearDown() throws Exception {
- System.out.println("Gone.....");
- // 这里关闭我们的资源
- }
-
- @Test
- public void test01() {
- // 测试1
- }
-
- @Ignore
- @Test
- public void test02() {
- // 测试2
- }
-
- }
需要一个特殊的Runner, 因此需要向@RunWith注解传递一个参数Suite.calss。
用来表明这个类是一个打包测试类,把需要打包的类作为参数传递给该注解即可。
有了这两个注解之后,就已经完整的表达了所有的含义,因此下面的类无关紧要,随便起个类名,内容为空
- import org.junit.runner.RunWith;
- import org.junit.runners.Suite;
- import org.junit.runners.Suite.SuiteClasses;
-
- public class DemoTest {
-
- @RunWith(Suite.class)
- @SuiteClasses({Demo01.class, Demo02.class, Demo03.class})
- public class AllTests {
-
- }
- }
首先要为这种测试专门生成一个新的类,而不能与其他测试共用同一个类。
这里不使用默认的Runner了,使用带有参数化功能的Runner。
@RunWith(Parameterized.class)这条语句就是为这个类指定了ParameterizedRunner。
这个需要和我们后面的@Parameters组合使用
放在方法上。
定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。
定义测试数据的结合,就是下方的prepareData()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。
这里需要注意:其中的数据是一个二维数组,数据两两一组,每组中的这两个数据,一个是参数,一个是预期的结果。比如第一组{2,4}中:2是参数,4是预期结果。这两数据顺序无所谓。
然后,是构造函数,其功能就是对先前定义的两个参数进行初始化。这里要注意参数的顺序,要和上面的数据集合的顺序保持一致。(比如都是先参数后结果)
那么这里我们还是看下面的例子吧
- import static org.junit.Assert.assertEquals;
-
- import java.util.Arrays;
-
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.junit.runners.Parameterized;
- import org.junit.runners.Parameterized.Parameters;
-
- @RunWith(Parameterized.class)
- public class FibonacciTest {
-
- @Parameters(name = "{index}: fib({0})={1}")
- public static Iterable<Object[]> data() {
- return Arrays.asList(new Object[][] {
- { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
- });
- }
-
- private int input;
- private int expected;
-
- public FibonacciTest(int input, int expected) {
- this.input = input;
- this.expected = expected;
- }
-
- @Test
- public void test() {
- assertEquals(expected, Fibonacci.compute(input));
- }
- }
控制测试方法的执行顺序的。
该注解的参数是org.junit.runners.MethodSorters对象。
枚举类org.junit.runners.MethodSorters中定义三种顺序类型:
MethodSorters.JVM:按照JVM得到的方法顺序,即代码中定义的方法顺序。
MethodSorters.DEFAULT:默认的顺序,以确定但不可预期的顺序执行。
MethodSorters.NAME_ASCENDING:按方法名字母顺序执行。
什么是Rule实现
Rule是一组实现了TestRule接口的共享类,提供了验证,监视TestCase和外部资源管理等能力。
即,提供了测试用例执行过程中一些通用功能的共享能力,使不必重复编写一些功能类似的代码。
JUnit4中包含两个注解:@Rule和@ClassRule
用于修饰Field或返回Rule的Method。
两者作用域不同:
Verifier:验证测试执行结果的正确性。
ErrorCollector:收集测试方法中出现的错误信息,测试不会中断,如果有错误发生,测试结束后会标记失败。
ExpectedException:提供灵活的异常验证功能。
Timeout:用于测试超时的Rule。
ExternalResource:外部资源管理。
TemporaryFolder:在JUnit的测试执行前后,创建和删除新的临时目录。
TestWatcher:监视测试方法生命周期的各个阶段。
TestName:在测试方法执行过程中提供获取测试名字的能力。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)
以上就是这节的全部内容,如有错误,还请各位指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。