自动化测试框架Selenium+java+TestNG

  • Post author:
  • Post category:java




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



版权声明:本文为adonis_lu37原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。