jck28 - 小柒 - Junit4 和TestNg测试框架

一,junit4测试框架

1,定义

  • junit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试

2,特点

  • JUnit是一个开放的资源框架,用于编写和可重复运行的测试
  • 提供注解来识别测试方法
  • 提供断言来测试预期结果
  • JUnit测试允许你编写代码块更快,并能提高质量
  • Junit优雅简洁.没那么复杂,花费时间较少
  • Junit测试可以自动运行并检查自身结果并提供即时反馈.所以也没有必要人工梳理测试结果的报告
  • Junit测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件
  • Junit在一个条中显示进度.如果运行良好则是绿色;如果运行失败,则变成红色

3,导入依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>RELEASE</version>
    <scope>test</scope>
</dependency>

4,常用注解

5,常用注解代码

a,基本注解

package com.ceshi.junit4Demo;

import org.junit.*;

public class Junit4DemoTest {
    @BeforeClass
    public static void beforClass(){
        System.out.println("该用例在所有测试之前执行一次");
    }

    @AfterClass
    public static void afterClass(){
        System.out.println("该用例在所有测试之后执行一次");
    }

    @Before
    public void before(){
        System.out.println("该用例在每个测试方法之前执行一次");
    }

    @Test
    public void test001(){
        System.out.println("这是第一条测试用例");
    }

    @Test
    public void test002(){
        System.out.println("这是第二条测试用例");
    }

    @After
    public void after(){
        System.out.println("该用例在每个测试方法之后执行一次");
    }

    @Ignore
    public void ignoreTest(){
        System.out.println("跳过该测试用例");
    }
}

b,@Parameterized参数化注解

package com.ceshi.junit4Demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;


//这里不能使用默认的Runner了,特殊功能要用特殊Runner
//使用@Parameterized注解需要注意:
// 该方法要有构造函数;
// 有一个public static的方法被@Parameters标注,并且该方法只能返回Iterable类型或数组类型的数据
@RunWith(Parameterized.class)
public class ParameterTest {
    private int expect;
    private int firstNumber;
    private int secondNumber;

    //构造方法
    public ParameterTest(int expect, int firstNumber, int secondNumber) {
        this.expect = expect;
        this.firstNumber = firstNumber;
        this.secondNumber = secondNumber;
    }

    //新建一个方法用于传参,方法必须为static方法
    @Parameterized.Parameters
    public static List<Integer[]> data(){
        return Arrays.asList(new Integer[][]{{3, 1, 2}, {5, 3, 2},{6,2,4}});
    }


    @Test
    public void parameterTest(){
        String format = "expect=%d  firstNumber=%d   secondNumber=%d ";
        System.out.println(String.format(format,expect,firstNumber,secondNumber));

        assertEquals(expect, firstNumber+secondNumber);
    }
}

c,测试套件注解 @RunWith和@Suite

package com.ceshi.junit4Demo;


import org.junit.runner.RunWith;
import org.junit.runners.Suite;


//@RunWith和@Suite这两个注解是用来运行套件测试
@RunWith(Suite.class)
@Suite.SuiteClasses({ParameterTest.class,Junit4DemoTest.class}) //这里类的配置顺序会影响执行顺序
public class SuiteTest {

}

d,执行顺序注解 @FixMethodOrder(MethodSorters.NAME_ASCENDING)

  • @FixMethodOrder(MethodSorters.DEFAULT) //取决于反射方法获得的列表,顺序固定(不保险)
  • @FixMethodOrder(MethodSorters.JVM) //顺序可能变化,不固定
  • @FixMethodOrder(MethodSorters.NAME_ASCENDING) //按照名字ASCII顺序(稳定常用,建议使用)
package com.ceshi.junit4Demo;

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

//@FixMethodOrder 按顺序执行注解
@FixMethodOrder(MethodSorters.NAME_ASCENDING)  
public class MethodOrderTest {
    @Test
    public void testFirst(){
        System.out.println("第1条用例");
    }

    @Test
    public void testSecond(){
        System.out.println("第2条用例");
    }

    @Test
    public void testThree(){
        System.out.println("第3条用例");
    }
}

二,testNg测试框架拓展

1,特点

注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。
并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。
丰富的配置: 可以通过 XML 配置文件来定义测试套件的执行顺序、依赖关系等。
分组测试: 可以将测试方法分组,实现对特定测试分组的执行。
参数化测试: 可以使用 @Parameters 和@ DataProvider注解实现参数化测试
依赖管理: 可以通过 dependsOnMethods 或 dependsOnGroups 设置测试方法之间的依赖关系。
断言灵活: TestNG 提供了丰富的断言方法,用于验证测试结果。

2,pom依赖导入

<dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.2</version>
        </dependency>
   </dependencies>

3,基本注解

更多详细注解可以参考文档:https://blog.51cto.com/u_15181572/6698378

* @Test:用于标识测试方法,执行单元测试。
* @BeforeSuite:在测试套件之前执行。
* @AfterSuite:在测试套件之后执行。
* @BeforeTest:在测试类之前执行。
* @AfterTest:在测试类之后执行。
* @BeforeClass:在测试类中的所有测试方法之前执行。
* @AfterClass:在测试类中的所有测试方法之后执行。
* @BeforeMethod:在每个测试方法之前执行。
* @AfterMethod:在每个测试方法之后执行。
* @DataProvider:用于提供测试数据。
* @Parameters:用于参数化测试。
* @dependsOnMethods:设置测试方法的依赖关系。

3.1 基本注解示例

import org.testng.annotations.*;

public class NGTest {

    @BeforeClass
    void beforeClass(){ System.out.println("BeforeClass: 在调用当前类的测试方法前执行一次"); }

    @AfterClass
    void afterClass(){ System.out.println("AfterClass: 在调用当前类的所有测试方法后执行一次"); }

    @BeforeMethod
    void beforeMethod(){ System.out.println("BeforeMethod: 在调用每个测试方法前执行一次"); }

    @AfterMethod
    void afterMethod(){ System.out.println("AfterMethod: 在调用每个测试方法后执行一次"); }

    @BeforeTest
    void beforTest(){ System.out.println("BeforTest: 在所有带有test标签的测试方法调用前执行"); }

    @AfterTest
    void afterTest(){ System.out.println("AfterTest: 在所有带有test标签的测试方法调用后执行"); }

    @Test
    void testNG(){ System.out.println("执行第一条用例: testNG"); }

    @Test
    void testRun(){ System.out.println("执行第2条用例:testRun "); }

    @Test
    void testSub(){ System.out.println("执行第3条用例:testSub "); }
}

3.2 Test注解参数说明

  • a. 常用的:
    groups: 用于将测试方法分组,可以在 XML 配置中选择性地执行指定组的测试。
    timeOut: 指定方法的超时时间,单位为毫秒。
    alwaysRun: 如果设置为 true,则无论依赖的方法是否失败,当前方法都会执行。
    dependsOnMethods: 指定测试方法的依赖关系,被依赖的方法会在当前方法之前执行。
    enabled: 控制测试方法是否启用,设置为 false 则禁用该方法。
    description: 提供关于测试方法的简要描述。
    invocationCount: 指定测试方法被调用的次数。

  • b. 数据驱动,需要结合@DataProvider注解对应获取参数的方法:
    dataProvider: 指定使用哪个数据提供者来提供测试数据。
    dataProviderClass: 指定数据提供者所在的类。

  • 并发:
    invocationCount: 指定测试方法被调用的次数。
    threadPoolSize: 指定线程池的大小,用于并行执行测试方法。
    timeOut:超时时间-毫秒
    dataProviderThreadCount: 指定数据提供者线程的数量。

3.3 代码示例

import org.testng.annotations.Test;

public class checkNGTest {
    @Test(groups="Performance")
    public void testMethod1() { System.out.println("Test Method 1"); }

    @Test(priority=1)
    public void testMethod2() { System.out.println("Test Method 2"); }

    @Test(dependsOnMethods = "testMethod4", alwaysRun = false)
    public void testMethod3(){ System.out.println("Test Method 3"); }

    @Test(timeOut = 3000)
    public void testMethod4() throws InterruptedException {
        Thread.sleep(4000);
        System.out.println("Test Method 4");
    }

    @Test(enabled = false, description = "用于测试enable注解,=false 禁用该方法")
    public void testMethod5() { System.out.println("Test Method 5"); }

}

4,常用断言

5,SoftAssert软断言

  • SoftAssert的特点:
    • 如果一个断言失败,会继续执行这个断言下的其他语句或者断言。
    • 也就是一个用例有多个断言,失败了其中一个,不影响其他断言的运行
    • 不要忘记调用assertAll()在该用例的最后一个断言后面。

6, testng.xml常用配置方式

//包维度
<packages>
    <package name="examples.packageA"/>
    <package name="examples.packageB"/>
</packages>

//分组维度控制
<groups>
   <define name="all">
         <include name="group01"/>
         <include name="group02"/>
   </define>
   <run>
       <include name="all"/>
       <exclude name="group02"/>
   </run>
</groups>

//类维度
<classes>
    <class name="examples.packageA.ClassATest">
          <methods>
              <include name ="testCaseA01"></include>
              <exclude name="testCaseA02"></exclude>
          </methods>
    </class>
</classes>

7,并发测试

  • name :suite的名称,必须参数
  • verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1
  • parallel : 是否多线程并发运行测试;可选值(false | methods | tests | classes ) ,默认 “false”
  • thread-count :当为并发执行时的线程池数量,默认为”5”
  • time-out :为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒