TestNG按顺序执行case
package seleniumKuangJia;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
public class DemoTestNG {
@BeforeClass
public void SetupApi() {
System.out.println("before test");
}
@Test
public void test1() {
System.out.println("at test1");
}
@Test
public void test2() {
System.out.println("at test2");
}
@Test
public void test3() {
System.out.println("at test3");
}
@AfterClass
public void setDown(){
System.out.println("end test");
}
}
xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test name="Test">
<classes>
<class name="seleniumKuangJia.DemoTestNG">
<methods>
<include name="test2"/>
<include name="test3"/>
<include name="test1"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
执行结果
在创建并运行以上代码时遇到的问题:
1.怎么创建testng.xml?
项目右键或选择具体的java文件右键------TestNG-----Convert to TestNG。
2.在testng.xml中遇到的问题:“The content of element type "classes" must match "(class*,parameter*)".”
3.如何将testng.xml跑起来?
右键这个xml文件,选择Run/Debug as TestNG Suite,TestNG就会读取XML文件开始跑test
TestNG参数化执行case
我们在测试中经常会遇到参数化执行case的情况, TestNG为我们提供了两种参数化的方式:
1.在xml文件中传递参数
2.使用@DataProvider传递参数
第一种方式:
<suite>和<test>标签定义了suite和test两种测试范围:一个test可以包含一系列的测试方法,一个suite可以包含多个独立的test。这两种测试范围有什么区别呢?一个test的所有测试方法都是针对同一测试对象,测试方法之间可以相互影响。而一个suite的每个test都是针对一个单独测试对象,两个test中的测试方法不会相互影响。
在这两种测试范围定义的参数,满足如下规律:
1)在Suite范围内定义某个参数的值,对所有的Test都有效。
2)在Test范围内定义某个参数的值,只是针对该Test有效。
3)如果同时在Suite和Test中定义某个参数,Test范围的值会屏蔽Suite的值。
示例代码如下:
DenoTestNG1.java
package seleniumKuangJia;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class DemoTestNG1 {
@BeforeClass
public void setup() {
System.out.println("begin test");
}
@Test
@Parameters({ "name" })
public void test1(String test1) {
System.out.println("测试1的名字是" + test1);
}
@AfterClass
public void teardown() {
System.out.println("end test");
}
}
DemoTestNG2.java
package seleniumKuangJia;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class DemoTestNG2 {
@BeforeClass
public void setup() {
System.out.println("begin test");
}
@Test
@Parameters("name")
public void test(String name) {
System.out.println("测试2的名字是" + name);
}
@AfterClass
public void teardown() {
System.out.println("end test");
}
}
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<parameter name="name" value="xiaokai" />
<test name="Test1">
<parameter name="name" value="xiaolu" />
<classes>
<class name="seleniumKuangJia.DemoTestNG1" />
</classes>
</test>
<test name="Test2">
<classes>
<class name="seleniumKuangJia.DemoTestNG2" />
</classes>
</test>
</suite> <!-- Suite -->
执行结果:
begin test
测试1的名字是xiaolu
end test
begin test
测试2的名字是xiaokai
end test
第二种方式:
package seleniumKuangJia;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DemoTestNG3 {
@BeforeClass
public void setup() {
System.out.println("begin test");
}
@DataProvider(name="testData")
public static Object[][] Database(){
return new Object[][] {
{"小明","男"},
{"小紅","女"}
};
}
@Test(dataProvider="testData")
public void test(String name,String sex) {
System.out.println(name+"性別是" + sex);
}
@AfterClass
public void teardown() {
System.out.println("end test");
}
}
执行结果:
begin test
小明性別是男
小紅性別是女
end test
PASSED: test("小明", "男")
PASSED: test("小紅", "女")
TestNG忽略性测试
在@Test后面添加dependsOnMethods={"testName"},则这个case依赖于testName这个case,如下图,我忽略了test1测试,那么dependTest也没法执行。
package seleniumKuangJia;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class DemoTestNG3 {
@BeforeClass
public void setup() {
System.out.println("begin test");
}
@Test(enabled=false)
@Parameters("name")
public void test1(String name) {
System.out.println("测试1的名字是" + name);
}
@Test(dependsOnMethods= {"test1"})
public void depandMethod() {
System.out.println("依賴性測試");
}
@DataProvider(name="testData")
public static Object[][] Database(){
return new Object[][] {
{"小明","男"},
{"小紅","女"}
};
}
@Test(dataProvider="testData")
public void test2(String name,String sex) {
System.out.println(name+"性別是" + sex);
}
@AfterClass
public void teardown() {
System.out.println("end test");
}
}
执行结果:
TestNG多线程并发执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!-- TesNG多线程并发执行 -->
<suite name="Suite" parallel="classes" thread-count="2">
<parameter name="name" value="阿三" />
<test name="Test1">
<parameter name="name" value="小七" />
<classes>
<class name="seleniumKuangJia.DemoTestNG1" />
<class name="seleniumKuangJia.DemoTestNG2" />
</classes>
</test>
</suite> <!-- Suite -->
执行结果:
begin test
begin test
测试2的名字是小七
end test
测试1的名字是小七
end test