使用@FixMethodOrder(annotation)注解控制JUnit单元测试方法执行顺序

目录

    • 前言
    • 正文
    • 一个案例

前言

我们在写JUnit测试用例时,有时候需要按照我们自定义的顺序执行单元测试的方法,尤其是在测试数据库相关的用例时,需要按照插入、查询、更新、删除的顺序测试,如果不指定方法执行的顺序的话,极大的可能是会出现问题的,例如在更新数据前,就已经删除了数据,查询也查不到了,这样就只能手动地控制方法的执行,降低了工作的效率。


在JUnit 4.11中,测试类的执行顺序可通过对测试类添加注解 “@FixMethodOrder(annotation)” 来指定。

正文

本文主要介绍使用@FixMethodOrder(annotation)注解控制JUnit单元测试方法执行顺序。
@FixMethodOrder(annotation)注解有三种参数类型,分别是:


MethodSorters.DEFAULT(默认的顺序)

以确定但不可预期的顺序执行,这是由方法名hashcode值来决定,如果hash值大小一致,则按名字的字典顺序确定。
对于不同操作系统,可能会出现不一样的执行顺序,在某一操作系统上,多次执行的顺序不变。


MethodSorters.JVM

按JVM返回的方法名的顺序执行,此种方式下测试方法的执行顺序是不可预测的,即每次运行的顺序可能都不一样。(JDK7里尤其如此)
这里网上很多文章都写错了,按照JVM返回的方法名执行,并不是按照你方法上下文的顺序执行的,其执行顺序还是不可预期的。


MethodSorters.NAME_ASCENDING(推荐使用)

按方法名称的字典顺序执行,由于是按字符的字典顺序,所以以这种方式指定执行顺序会始终保持一致。
不过这种方式需要对测试方法有一定的命名规则,如测试方法均以testNN开头。(NN表示测试方法序列号 01-99)


一个案例

案例中,在测试方法中使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)注解表明我希望执行时按照方法名称的字典顺序执行,我的添加、更新、查询、删除均以 test1-4 开头,保证了方法的执行顺序,即使在代码中上下文位置发生变化,也不会改变测试时的执行顺序。

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MybatisTest {

	static Good good;
	
	/**
	 * 添加good
	 */
	@Test
	public void test1AddCustomer() throws Exception{

		SqlSession sqlSession = MybatisUtils.getSqlSession();
		// 4、SqlSession执行添加操作
		// 4.1创建Customer对象,并向对象中添加数据
		good = new Good();
		good.setGoodname("rose");
		good.setGooddescr("123");
		good.setGoodprice("123456");
		// 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
		int rows = sqlSession.insert("com.mapper"
				+ ".GoodMapper.addGood", good);
		// 4.3通过返回结果判断插入操作是否执行成功
		if(rows > 0){
			System.out.println("**************************************************************");
			System.out.println("再做一个添加Good");

			System.out.println("您成功插入了"+rows+"条数据!");
			System.out.println("您新增的商品的ID为"+good.getId());

			System.out.println("添加Good结束");
			System.out.println("**************************************************************");
			System.out.println();
		}else{
			System.out.println("执行插入操作失败!!!");
		}
		// 4.4提交事务
		sqlSession.commit();
		// 5、关闭SqlSession
		sqlSession.close();
	}


	/**
	 * 更新good
	 */
	@Test
	public void test2UpdateGood() throws Exception{
		SqlSession sqlSession = MybatisUtils.getSqlSession();
		// 4、SqlSession执行更新操作
		// 4.1 对对象中的数据进行模拟更新
		good.setGoodname("我要更改商品");
		good.setGooddescr("999");
		good.setGoodprice("12.0");

		// 4.2执行SqlSession的更新方法,返回的是SQL语句影响的行数
		int rows = sqlSession.update("com.mapper"
				+ ".GoodMapper.updateGood",good);
		// 4.3通过返回结果判断更新操作是否执行成功
		if(rows > 0){
			System.out.println("**************************************************************");
			System.out.println("再做一个更新Good");

			System.out.println("您成功修改了"+rows+"条数据!");

			System.out.println("更新Good结束");
			System.out.println("**************************************************************");
			System.out.println();
		}else{
			System.out.println("执行修改操作失败!!!");
		}
		// 4.4提交事务
		sqlSession.commit();
		// 5、关闭SqlSession
		sqlSession.close();
	}

	/**
	 * 根据商品ID查询商品信息
	 */
	@Test
	public void test3FindCustomerById() throws Exception {
		// 通过SqlSessionFactory创建SqlSession
		SqlSession sqlSession = MybatisUtils.getSqlSession();
		// SqlSession执行映射文件中定义的SQL,并返回映射结果
		Good returngood = sqlSession.selectOne("com.mapper"
				+ ".GoodMapper.findGoodById", good.getId());
		// 打印输出结果
		System.out.println("**************************************************************");
		System.out.println("再把刚刚更新的Good查出来看看");

		System.out.println(returngood.toString());

		System.out.println("看看结束");
		System.out.println("**************************************************************");
		System.out.println();
		// 关闭SqlSession
		sqlSession.close();
	}

	/**
	 * 删除商品
	 */
	@Test
	public void tset4DeleteGood() throws Exception{

		SqlSession sqlSession = MybatisUtils.getSqlSession();
		// 4、SqlSession执行删除操作
		// 4.1执行SqlSession的删除方法,返回的是SQL语句影响的行数
		int rows = sqlSession.delete("com.mapper"
				+ ".GoodMapper.deleteGood", good.getId());
		// 4.2通过返回结果判断删除操作是否执行成功
		if(rows > 0){
			System.out.println("**************************************************************");
			System.out.println("再把Good删掉方便下次直接测试");

			System.out.println("您成功删除了"+rows+"条数据!");

			System.out.println("测试结束");
			System.out.println("**************************************************************");
			System.out.println("Perfect");
			System.out.println();
		}else{
			System.out.println("执行删除操作失败!!!");
		}
		// 4.3提交事务
		sqlSession.commit();
		// 5、关闭SqlSession
		sqlSession.close();
	}

}

你可能感兴趣的:(笔记)