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

本文介绍了使用TestNG自动化测试框架进行测试案例的顺序执行和参数化操作。首先,讲解了如何创建testng.xml文件,解决在创建过程中遇到的错误问题。接着,展示了TestNG如何通过xml配置文件和@DataProvider实现参数化测试,并解释了suite与test的区别以及参数生效范围。最后,提到了TestNG的依赖执行和多线程并发执行的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值