赞
踩
JUnit和TestNG是最受欢迎的两个单元测试框架
默认情况下,JUnit的运行顺序无规律
JUnit3:
//JUnit3的测试类必须继承TestCase
public class JUnit3Test extends TestCase {
//JUnit3的测试方法必须test开头
public void testName() {
}
}
//JUnit使用注解来运行,无需继承TestCase,也不需要测试驱动以test开头
public class JUnit4Test {
@Test
public void testName() {
}
}
JUnit:@BeforeClass和**@AfterClass的方法需要加*static***
常用:
不常用:
TestNG:
方法级别:@BeforeMethod:测试方法运行前执行的方法注解
@AfterMethod:测试方法运行后执行的方法注解
类级别:@BeforeClass
@AfterClass
套件:@BeforeSuite、@AfterSuite
组级别:@BeforeGroup、@AfterGroup
@Test
true
,表示即使该测试方法所依赖的前置测试有失败的情况,也要执行@DataProvider
注解将在后面章节介绍)true
,如果指定为false
,表示不执行该测试方法。invocationCount
没有指定,该参数会被忽略。应用场景可以为测试获取数据库连接,超时就认定为失败。单位是毫秒。多线程:threadPoolSize = 3,invocationCount = 6,timeOut = 1000
@Test(enable=false)
JUnit利用@RunWith、@SelectPackages、@SelectClasses注解来组合测试用例
@RunWith(Suite.class)
@Suite.SuiteClasses({
JUnit3Test.class,
JUnit4Test.class
})
public class JUnitTest {
}
TestNG
@Test(groups = {"group2","group1"})
<test name="test-2">
<groups>
<run>
<include name="group2"/>
<include name="group1"/>
</run>
</groups>
<packages>
<package name="com.cxl.testng"/>
</packages>
</test>
JUnit
@RunWith(value = Parameterized.class) public class JUnitTest { private int number; public JUnitTest06(int number) { this.number = number; } @Parameterized.Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][]{{1},{2},{3},{4}} ; return Arrays.asList(data); } @Test public void pushTest() { System.out.println("Parameterized Number is : " + number); } }
TestNG
@Parameters({"param1"})
@Test
public void paramterTest(String param1){
System.out.println("\n---------------"+param1);
}
<parameter name="param1" value="http://127.0.0.1:4723/wd/hub" />
<test name="testDemo1">
<classes>
<class name="com.cxl.testng.TestNG01"></class>
</classes>
</test>
TestNG:
@Test(dataProvider = "userData")
public void test(Class clazz, String[] str) {
System.out.println(clazz + "-------------" + str[0]);
System.out.println(clazz + "-------------" + str[1]);
}
@DataProvider(name = "userData")
public Object[][] data() {
Object[][] objects = new Object[][]{
{Vector.class, new String[]{"java.util.Arrays", "java.util.List"}},
{String.class, new String[]{"this is my str", "this is my pp"}},
{Integer.class, new String[]{"123", "345"}},
{Float.class, new String[]{"12.45f", "33.11f"}}};
return objects;
}
JUnit4 框架主要聚焦于测试的隔离,暂时还不支持这个特性。
TestNG使用dependOnMethods、dependsOnGroups 来实现了依赖测试的功能。
@Test
public void method1() {
System.out.println("This is method 1");
}
@Test(dependsOnMethods={"method1"})
public void method2() {
System.out.println("This is method 2");
}
如果method1()成功执行,那么method2()也将被执行,否则method2()将会被忽略。
@Test(groups = { "init.1" })
public void test1() {
}
@Test(groups = { "init.2" })
public void test2() {
}
@Test(dependsOnGroups = { "init.*" })
public void test3() {
}
Junit单元测试不支持多线程测试,TestNg使用threadPoolSize用来指明线程池的大小。
public class TestNgThreadPoolSize {
@Test(threadPoolSize = 3,invocationCount = 5)
public void threadPool(){
System.out.println("Thread ----------"+Thread.currentThread().getName());
}
}
建议使用TestNG作为Java项目的核心单元测试框架,因为TestNG在参数化测试,依赖测试和套件测试(分组概念)方面更加突出。 TestNG用于高级测试和复杂集成测试。 它的灵活性对于大型测试套件尤其有用。 此外,TestNG还涵盖了整个核心的JUnit4功能。
在单元测试中模拟一个被调用方法,进而隔离测试环境,其实现原理是利用接口的多态性。
通常意义的mock指的就是mock server,模拟服务端返回的接口数据,用于前端开发
@Mock
private IExecuteSqlManage iExecuteSqlManage;
@BeforeMethod
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(AopTargetUtils.getTarget(espJfxxInfoFileToDb), "iExecuteSqlManage", iExecuteSqlManage);
}
@AfterMethod
public void tearDown() throws Exception {
ReflectionTestUtils.setField(AopTargetUtils.getTarget(espJfxxInfoFileToDb), "iExecuteSqlManage", null);
}
1、类上加注解
@PowerMockIgnore("javax.management.*,org.apache.log4j.*")
@PrepareForTest({AcctFileProcessUtil.class, FileTool.class, GlobalConf.class}) //需要Mock的静态类
@PowerMockIgnore({"javax.xml.*", "org.xml.sax.*", "org.w3c.dom.*", "org.springframework.context.*", "org.apache.log4j.*"})
2、初始化
@ObjectFactory
public ITestObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
3、自定义返回值
PowerMockito.mockStatic(GlobalConf.class);
PowerMockito.when(GlobalConf.getString(anyString(), any())).thenReturn("path_in");
4、检验次数
PowerMockito.verifyStatic(times(1));
验证结果
@Test
void getPeopleById() {
People people = peopleService.getPeopleById(1);
//System.out.println(people);
Assert.assertNotNull(people);
Assert.assertEquals(people.getAge(), 11);
Assert.assertEquals(people.getName(),"cxl");
}
try {
agetAgentSeqImpl.getAgetAgentSeq(req);
} catch (Exception e) {
Assert.assertEquals(e.getMessage(),"未取到代理商充值流水");
}
agetAgentSeqRes = agetAgentSeqImpl.getAgetAgentSeq(req);
Assert.assertEquals(agetAgentSeqRes.getXtableAgentSeq(), "null~0~-1~null~-1~1~0~-1~null~-1~0~20170301000000~null~0~0~0~-1~0~1~;");
验证方法是否被调用
@Test public void testVerify() { // 创建并配置 mock 对象 MyClass test = Mockito.mock(MyClass.class); when(test.getUniqueId()).thenReturn(43); // 调用mock对象里面的方法并传入参数为12 test.testing(12); test.getUniqueId(); test.getUniqueId(); // 查看在传入参数为12的时候方法是否被调用 verify(test).testing(Matchers.eq(12)); // 方法是否被调用两次 verify(test, times(2)).getUniqueId(); // 其他用来验证函数是否被调用的方法 verify(mock, never()).someMethod("never called"); verify(mock, atLeastOnce()).someMethod("called at least once"); verify(mock, atLeast(2)).someMethod("called at least twice"); verify(mock, times(5)).someMethod("called five times"); verify(mock, atMost(3)).someMethod("called at most 3 times"); }
断言错误
@Test(expectedExceptions = com.newland.common.NLException.class)
public void queryUserUnionPayUserIdMinusOne() throws Exception {
try {
qryUserUnionPayImpl.qryUserUnionPay(getReq("-1"));
} catch (NLException e) {
//断言结果是否与预期相同
Assert.assertEquals(e.getResCode(), CloudErrorCode.ERR_PAKERR);
Assert.assertEquals(e.getMessage(), "帐户userid节点没找到或值不对");
throw e;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。