TestNG调用方式
testng.xml 文件 命令行 ant
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<classes>
<class name="TestEmployeeDetails"/>
</classes>
</test>
</suite>
suite代表一个XML文件,可以包含一个或多个测试。 test代表一个测试,可以包含一个或多个TestNG的类 class代表一个TestNG类,是一个Java类,它包含至少一个TestNG的注解。它可以包含一个或多个测试方法。
命令行
C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
TestNG XML
标签 说明 <suite> 根标签,通常由几个<test组成> <test> 测试用例,name为必须属性 <classes> 用例中包含的类,子标签为<class name=”className”> <class> 测试类,其中属性name为必须属性 <packages> 用例中包含的包,包中所有的方法都会执行,子标签为<package name=”packageName”> <package> 测试包,name为必须属性 <methods> 指定测试类中包含或排除的方法,子类为<include>,<exclude> <include> 指定需要测试的方法,name为必须属性 <exclude> 指定类中不需要测试的方法,name为必须属性 <groups> 指定测试用例中要运行或排除运行的分组,子标签为<run>,<run>下包含<include>,<exclude>标签,<include>,<exclude>的name指定运行、不运行的分组。<groups>可以定义在<suite>(全局组)或者<test>下
suite属性
属性 描述 name 此套件的名称。这是一个强制性的属性。 verbose 这个运行级别或冗长。 parallel 由TestNG 运行不同的线程来运行此套件。 thread-count 使用的线程数,如果启用并行模式(忽略其他方式)。annotations 在测试中使用注释的类型。 time-out 默认的超时时间,将用于本次测试中发现的所有测试方法。
TestNG注解
注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中。 @AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后。 @BeforeClass 注解的方法将只运行一次先行先试在当前类中的方法调用。 @AfterClass 注解的方法将只运行一次后已经运行在当前类中的所有测试方法。 @BeforeTest 注解的方法将被运行之前的任何测试方法属于内部类的 标签的运行。 @AfterTest 注解的方法将被运行后,所有的测试方法,属于内部类的标签的运行。 @BeforeGroups 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。 @AfterGroups 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 @BeforeMethod 注解的方法将每个测试方法之前运行。 @AfterMethod 被注释的方法将被运行后,每个测试方法。 @DataProvider 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[][],其中每个对象[]的测试方法的参数列表中可以分配。该@Test方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。 @Factory 作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。 @Listeners 定义一个测试类的监听器。 @Parameters 介绍如何将参数传递给@Test方法。 @Test 标记一个类或方法作为测试的一部分。
@Test属性
测试方法是否执行enable 默认是true,如果设置为false,则在运行时不会执行这个测试方法; 预期异常expectedExeption @Test(expectedExceptions = ClassName.class) 如果ClassName类抛出了异常,测算测试通过,没有异常算测试不通过; expectedExceptions的值也可以是一个数组: @Test(expectedExceptions = {ClassName.class, ClassName2.class,… }) 超时timeOut 单位为毫秒,如果测试方法运行时间超这个值算测试不通过; 分组groups (1)把在一个标签内的中所有类方法再进行组,在运行时,一个组的方法会一起运行,然后再运行下一个组的方法; (2)分组的最小维度为方法,当把带分组的@Test(groups = ”groupName”)注解对类使用时,这个测试类中的所有方法都属于这同一个组; (3)一个方法也可以同时属于多个组,@Test(groups = {“groupName1”, “groupName2”}),那么每组运行时这个方法都会被执行一次; (4)同一个组里的方法类,如果分别属于两个不同的测试用例()内,那么它们其实可以算两个组,它们会在每个测试用例分别运行,而不会合在一起运行; 依赖方法dependsOnMethods 在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了;依赖的方法可以有多个; 例:@Test(dependsOnMethods = { “methodName1” , “methodName2” }) 依赖组,dependsOnGroups 和依赖方法类似,在被依赖组运行完成之后运行当前组,如果依赖组中的方法没有测试能过,那么当前的方法也不会继续运行了;依赖组可以有多个;
@DataProvider
public class ParamTestWithDataProvider {
@DataProvider(name = "test")
public static Object[][] buildDataProvider() {
return newObject[][]{
{
new Bean("hi I am the bean", 111)
}
} ;
}
@Test(dataProvider = "test")
public void testMethod(Bean bean) {
System.out.println(bean.getName() + "" + bean.getAge());
}
}
Assert
assertEqual ([String message], expected value, actual value) 断言两个值相等,值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息; assertTrue([String message], boolean condition) ,断言一个条件为真; assertFalse([String message],boolean condition),断言一个条件为假; assertNotNull([String message], java.lang.Object object),断言一个对象不为空(null); assertNull([String message], java.lang.Object object),断言一个对象为空(null); assertSame([String message], java.lang.Object expected, java.lang.Object actual),断言两个对象引用相同的对象; assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual),断言两个对象不是引用同一个对象; assertArrayEquals([String message], expectedArray, resultArray),断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.;
TestNG运行JUnit测试
junit = "true"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Converted JUnit suite" >
<test name="JUnitTests" junit="true">
<classes>
<class name="TestJunit" />
</classes>
</test>
</suite>
TestNG自定义日志记录
public class CustomListener extends TestListenerAdapter{
private int m_count = 0;
@Override
public void onTestFailure(ITestResult tr) {
log(tr.getName()+ "--Test method failed\n");
}
@Override
public void onTestSkipped(ITestResult tr) {
log(tr.getName()+ "--Test method skipped\n");
}
@Override
public void onTestSuccess(ITestResult tr) {
log(tr.getName()+ "--Test method success\n");
}
private void log(String string) {
System.out.print(string);
if (++m_count % 40 == 0) {
System.out.println("");
}
}
}
TestNG自定义记录器
public class CustomReporter implements IReporter {
@Override
public void generateReport(List xmlSuites, List suites, String outputDirectory) {
//Iterating over each suite included in the test
for (ISuite suite : suites) {
//Following code gets the suite name
String suiteName = suite.getName();
//Getting the results for the said suite
Map suiteResults = suite.getResults();
for (ISuiteResult sr : suiteResults.values()) {
ITestContext tc = sr.getTestContext();
System.out.println("Passed tests for suite '" + suiteName + "' is:" + tc.getPassedTests().getAllResults().size());
System.out.println("Failed tests for suite '" + suiteName + "' is:" +
tc.getFailedTests().getAllResults().size());
System.out.println("Skipped tests for suite '" + suiteName + "' is:" +
tc.getSkippedTests().getAllResults().size());
}
}
}
}
与Junit4的异同比较,可直接参考使用Junit4