Java--TestNG框架的使用及与Python--pytest的区别(o゜▽゜)o

简介

TestNG是一个流行的测试框架,是JUnit的扩展,它支持更丰富的测试场景和功能。TestNG的核心思想是测试用例的优先级和依赖关系,这使得测试套件的组织和执行更加灵活和高效。以下是TestNG的一些主要特点:
1.支持多种测试场景:TestNG支持各种测试类型,包括单元测试、集成测试、功能测试、端到端测试等,可以满足不同测试场景的需求。
2.注解丰富:TestNG提供了多种注解来标记测试方法、测试套件、测试类等,可以方便地组织和执行测试用例。
3.支持测试用例分组:TestNG允许测试用例分组,以便按组运行测试用例,这对于大规模测试套件的组织和管理非常有帮助。
4.支持数据驱动测试:TestNG支持数据驱动测试,可以使用不同的数据集执行同一个测试用例,以验证测试用例的健壮性和正确性。
5.支持依赖关系:TestNG允许测试用例之间建立依赖关系,以确保测试用例的执行顺序和正确性。
6.多线程执行测试用例:TestNG可以在多个线程中并发执行测试用例,以加速测试执行速度。
7.丰富的报告功能:TestNG提供了丰富的测试报告功能,可以生成HTML、XML等格式的测试报告,以便测试结果的分析和展示。

使用

1.可以在TestNG官方网站上手动下载最新版本的TestNG库。下载完成后,将jar文件添加到你的项目的classpath中。
https://testng.org/doc/download.html
2.也可以直接添加maven文件(推荐这个)
将以下依赖项添加至 pom.xml 文件中

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.4.0</version>
    <scope>test</scope>
</dependency>

Java--TestNG框架的使用及与Python--pytest的区别(o゜▽゜)o_第1张图片
3.添加完成后,我们先来了解一下用例管理
在testng中,用例的标注是@Test来说明的,带有此注解的方法或者类将被TestNG识别并运行
Java--TestNG框架的使用及与Python--pytest的区别(o゜▽゜)o_第2张图片
4.在testng中,用例执行的前后可以通过以下方式来实现,只需在方法和类前加上对应@即可:

@BeforeSuit / @AfterSuit--------------------带注释的方法将在该套件
中的所有测试运行之前/后运行
@BeforeTest / @AfterTest--------------------带注释的方法将在运行属
于标记内的类的任何测试方法之前/后运行
@BeforeClass / AfterClass -------------------带注释的方法将在调用
当前类中的第一个测试方法之前/后运行
@BeforeMethod / @AfterMethod ----------带注释的方法将在每个测试
方法之前/后运行
一个简单的例子

以下示例创建了一个名为 SimpleTest 的测试类,其中包含一个名为 test() 的测试方法,使用 @Test 注解来标记该方法是一个测试方法。在测试方法内部,输出一条字符串信息

import org.testng.annotations.Test;

public class SimpleTest {
    @Test
    public void test() {
        System.out.println("This is a TestNG test");
    }
}

现在要在test执行前后运行用例,如下:@BeforeTest注解标记的setUp()方法会在所有@Test方法运行之前执行,@AfterTest注解标记的tearDown()方法会在所有@Test方法运行之后执行。

import org.testng.annotations.*;

public class MyTest {
    
    @BeforeTest
    public void setUp() {
        // 在所有测试方法运行之前执行的代码
        System.out.println("执行@BeforeTest注解的方法");
    }
    
    @Test
    public void test() {
        // 测试方法1
        System.out.println("执行测试方法1");
    }
    
    @AfterTest
    public void tearDown() {
        // 在所有测试方法运行之后执行的代码
        System.out.println("执行@AfterTest注解的方法");
    }
}

TestNG进阶

1. 传参

传参我们可以通过使用@Parameters来实现,在这里我们在测试用例方法中需要设置对应的参数去接收,如下:
注意如果有多个参数会按我们@Parameters中设置的顺序进行传参

import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;

public class MyTest {
    @Test
    @Parameters{"a", "b", "c"})
    public void beforeTest(int a, int b, int c) {
        int result = a + b;
        Assert.assertEquals(result, c); //断言result=c
    }
}
2.跳过测试用例
@Ignore: 跳过测试用例,被注解的测试方法不会被执行。
@Test(enabled = false): 与 @Ignore 类似,将测试用例标记为禁用状态,
被注解的测试方法不会被执行。
3.断言
Assert.assertXXX(): 断言方法,用于判断测试结果是否符合预期。
//常用断言
1.assertEquals(expected, actual): 验证预期结果和实际结果是否相等。
2.assertNotEquals(expected, actual): 验证预期结果和实际结果是否不相等。
3.assertTrue(condition): 验证条件是否为 true。
4.assertFalse(condition): 验证条件是否为 false。
5.assertNull(object): 验证对象是否为 null。
6.assertNotNull(object): 验证对象是否不为 null。
7.assertSame(expected, actual): 验证预期结果和实际结果是否是同一个对象。
8.assertNotSame(expected, actual): 验证预期结果和实际结果是否不是同一个对象。
9.assertArrayEquals(expectedArray, actualArray): 验证预期结果和实际结果是否是相等的数组。
4.添加日志

Reporter.log()是TestNG中的一个方法,用于向测试报告中添加自定义的日志信息。该方法接受一个String类型的参数,表示要添加的日志信息

import org.testng.Reporter;
import org.testng.annotations.Test;

public class MyTest {
    @Test
    public void myTestMethod() {
        // 添加日志信息
        Reporter.log("这是一个自定义的日志信息");
    }
}

在测试报告中,会看到类似如下的日志信息:

这是一个自定义的日志信息

Reporter.log()方法还可以接受一个boolean类型的参数,表示是否将日志信息显示在测试报告中。如果参数为true,则显示在测试报告中;如果参数为false,则不显示在测试报告中。默认情况下,日志信息会显示在测试报告中

import org.testng.Reporter;
import org.testng.annotations.Test;

public class MyTest {
    @Test
    public void myTestMethod() {
        // 添加日志信息,并将日志信息显示在测试报告中
        Reporter.log("这是一个自定义的日志信息", true);
    }
}
5.多线程执行

在 TestNG 中实现多线程有两种方式:通过线程池执行、通过 data provider 参数化执行。

5.1.线程池执行方式
通过设置 @Test 注解的 threadPoolSize 和 invocationCount 参数可以实现多线程执行,其中:

threadPoolSize 表示线程池大小,即并发执行的线程数
invocationCount 表示测试方法被调用的次数。
如下:
@Test(threadPoolSize = 10, invocationCount = 100)
public void test() {
// 测试方法
}

以上代码会创建一个大小为 10 的线程池,并重复执行 test() 方法 10次,每次由线程池中的一个线程执行。

5.2.data provider 参数化执行方式
通过 data provider 提供参数来实现多线程执行,data provider 可以提供多组参数,每组参数作为一个独立的测试执行。同时通过设置 @Test 注解的 threadPoolSize 和 dataProviderThreadCount 参数,可以实现并发执行多组参数。
以下代码会使用 dataprovider 方法 dataProviderMethod() 提供的三组参数 {1, 2}、{3, 4}、{5, 6},通过 5 个线程池并发执行,每个线程执行 3 次,即总共执行 15 次测试。

@Test(dataProvider = "provider", threadPoolSize = 5, dataProviderThreadCount = 10)
//dataProviderThreadCount为最大执行次数
public void test(int a, int b) {
    // 测试方法
}

@DataProvider(name = "provider")
public Object[][] dataProviderMethod() {
    return new Object[][] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
}

TestNG和Pytest的区别

之前只使用过python的同学可以了解一下

1.运行媒介不同
  • TestNG需要的环境是Java,他是基于Junit的
  • Pytest在python解释器上运行,是基于函数的,即定义测试函数并在函数内编写测试代码。
2.断言语法
  • TestNG的断言语法是基于Assert类的静态方法,如Assert.assertEquals(),Assert.assertTrue()等。TestNG的断言语法可以方便地比较两个对象或者比较一个对象和期望值的大小关系。
  • Pytest的断言语法是基于Python的assert语句,例如assert x == y,assert a > b等。Pytest的断言语法可以直接使用Python语言提供的assert语句,可以方便地比较各种数据类型的值。
3.多线程测试
  • TestNG的多线程测试通过上面的线程池执行和参数化执行两种方式实现
  • Pytest中可以通过使用pytest-xdist插件来实现多线程执行测试用例
4.参数化
  • TestNG中可以使用@DataProvider或@Parameters实现
  • Pytest中使用@pytest.mark.parametrize注解来提供测试数据
5.用例执行设置
  • TestNG中可以通过@BeforeXXX,@AfterXXX来实现
  • Pytest中是setupXXX,teardownXXX
6.插件生态系统
  • TestNG插件生态系统相对较小,官方只提供了少量的插件
  • Pytest插件生态系统非常丰富,可以满足各种不同的测试需求
7.测试报告
  • TestNG的测试报告相对Pytest更为详细和友好,包含更多的测试结果信息和图表展示
  • Pytest的测试报告相对简洁,提供的信息较少,可以接入allure
8.分组
  • TestNG可以使用@Test注解中的groups属性将测试方法分组,然后可以在testng.xml配置文件中指定要运行哪些组,从而可以只运行特定组的测试用例
  • Pytest可以使用pytest.mark标记来给测试用例打标签,然后可以通过命令行参数-m来选择运行哪些标记的测试用例。

你可能感兴趣的:(自动化测试框架,java,python,pytest)