TestNG

TestNG调用方式

  1. testng.xml 文件
  2. 命令行
  3. 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属性

  1. 测试方法是否执行enable
    默认是true,如果设置为false,则在运行时不会执行这个测试方法;
  2. 预期异常expectedExeption
    @Test(expectedExceptions = ClassName.class)
    如果ClassName类抛出了异常,测算测试通过,没有异常算测试不通过;
    expectedExceptions的值也可以是一个数组:
    @Test(expectedExceptions = {ClassName.class, ClassName2.class,… })
  3. 超时timeOut
    单位为毫秒,如果测试方法运行时间超这个值算测试不通过;
  4. 分组groups
    (1)把在一个标签内的中所有类方法再进行组,在运行时,一个组的方法会一起运行,然后再运行下一个组的方法;
    (2)分组的最小维度为方法,当把带分组的@Test(groups = ”groupName”)注解对类使用时,这个测试类中的所有方法都属于这同一个组;
    (3)一个方法也可以同时属于多个组,@Test(groups = {“groupName1”, “groupName2”}),那么每组运行时这个方法都会被执行一次;
    (4)同一个组里的方法类,如果分别属于两个不同的测试用例()内,那么它们其实可以算两个组,它们会在每个测试用例分别运行,而不会合在一起运行;
  5. 依赖方法dependsOnMethods
    在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了;依赖的方法可以有多个;
    例:@Test(dependsOnMethods = { “methodName1” , “methodName2” })
  6. 依赖组,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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值