You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为给定Java Stack类编写带@BeforeTest等注解的TestNG测试用例

针对Stack类的TestNG测试用例实现

前置说明

你需要先引入TestNG依赖,如果你用Maven的话,pom.xml添加如下依赖(Gradle项目对应调整配置即可):

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

测试注解作用说明

你要求用到的四个注解的执行顺序和作用如下:

  • @BeforeTest:TestNG测试套件中标签下所有测试类运行前仅执行1次,适合做套件级别的初始化操作
  • @BeforeClass:当前测试类所有测试方法运行前仅执行1次,适合做类级别的全局资源初始化
  • @BeforeMethod:每个测试方法运行前都会执行1次,用来重置测试对象,保证不同测试用例之间的环境隔离
  • @AfterClass:当前测试类所有测试方法运行完成后仅执行1次,用来释放类级别占用的资源

完整测试代码

package au.com.junitpractice;

import org.testng.Assert;
import org.testng.annotations.*;

public class StackTest {
    // 声明测试对象,每个测试方法使用的栈会在@BeforeMethod里完成初始化
    private Stack stack;

    @BeforeTest
    public void beforeTest() {
        System.out.println("===== Stack模块测试开始 =====");
        // 此处可放置测试套件级别的初始化逻辑,比如加载全局测试配置
    }

    @BeforeClass
    public void beforeClass() {
        System.out.println("StackTest测试类执行开始,所有测试用例即将运行");
        // 此处可放置类级别的一次性初始化逻辑,比如读取测试用例数据文件
    }

    @BeforeMethod
    public void beforeMethod() {
        // 每个测试方法执行前都新建一个全新的栈,避免用例之间互相影响
        stack = new Stack();
        System.out.println("单个测试用例执行环境初始化完成");
    }

    @Test(description = "验证空栈初始状态是否正确")
    public void testEmptyStack() {
        Assert.assertEquals(stack.getSize(), 0);
        Assert.assertEquals(stack.getMax(), 0);
    }

    @Test(description = "验证单元素push操作的正确性")
    public void testPushSingleElement() {
        stack.push(5);
        Assert.assertEquals(stack.getSize(), 1);
        Assert.assertEquals(stack.getMax(), 5);
    }

    @Test(description = "验证多元素push后最大值计算的正确性")
    public void testPushMultipleElementsMax() {
        stack.push(3);
        stack.push(7);
        stack.push(2);
        Assert.assertEquals(stack.getSize(), 3);
        Assert.assertEquals(stack.getMax(), 7);
    }

    @Test(description = "验证pop操作的返回值和栈状态正确性")
    public void testPopOperation() {
        stack.push(4);
        stack.push(9);
        int popVal = stack.pop();
        Assert.assertEquals(popVal, 9);
        Assert.assertEquals(stack.getSize(), 1);
        Assert.assertEquals(stack.getMax(), 4);
    }

    @Test(description = "验证栈元素全部pop后状态回滚是否正确")
    public void testPopAllElements() {
        stack.push(6);
        stack.push(8);
        stack.pop();
        stack.pop();
        Assert.assertEquals(stack.getSize(), 0);
        Assert.assertEquals(stack.getMax(), 0);
    }

    @Test(description = "验证连续push pop场景下最大值的正确性")
    public void testContinuousPushPopMax() {
        stack.push(5);
        stack.push(10);
        stack.push(7);
        Assert.assertEquals(stack.getMax(), 10);
        stack.pop();
        Assert.assertEquals(stack.getMax(), 10);
        stack.pop();
        Assert.assertEquals(stack.getMax(),5);
    }

    @AfterClass
    public void afterClass() {
        System.out.println("StackTest测试类所有用例执行完成");
        // 此处可放置类级别资源释放逻辑,比如关闭文件流、数据库连接
    }
}

执行顺序验证

运行测试后可以看到控制台输出的执行顺序符合预期:
@BeforeTest -> @BeforeClass -> [每个方法前执行@BeforeMethod -> 执行测试方法] * N -> @AfterClass

内容的提问来源于stack exchange,提问作者Mashhood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:54:04