前50名 TestNG 面试问题与答案(2026)

置顶 TestNG 面试问答

准备一个 TestNG 面试?是时候考虑一​​下哪些问题能展现你的优势了。一个扎实的面试技巧至关重要。 TestNG 面试基础体现了应聘者的深度、自信和准备情况,这些都是招聘团队所看重的。

该领域的发展机遇涵盖自动化增长、不断演进的框架以及需要技术和专业经验的实际测试应用。从事该领域的工作需要具备领域专业知识、分析能力和灵活的技能组合,这有助于应届毕业生、中级和高级专业人员解答技术、基础和高级方面的常见热门问题。
阅读全文...

👉免费PDF下载: TestNG 面试问答

置顶 TestNG 面试问答

1)什么是 TestNG 为什么自动化测试中会用到它?

TestNG (下一代测试)是一个受以下因素启发而设计的测试框架: JUnit 它与 NUnit 类似,但增强了分组、排序、参数化和依赖管理等高级功能。它主要用于自动化测试,以简化测试执行、改进测试组织并生成详细的 HTML 和 XML 报告。

的主要好处 TestNG 包括:

  • 支持 并行测试执行从而减少总运行时间。
  • 提供 注释 有效控制测试流程。
  • 优惠精选 数据驱动测试 通过 @DataProvider 注解。
  • 生成 可定制的报告 为了更好地进行调试。

例如, TestNG 允许您独立执行冒烟测试、回归测试和集成测试组,而无需修改测试代码,从而在大型自动化套件中提供灵活性和可扩展性。


2)解释 TestNG 生命周期及其注解和执行顺序。

这个 TestNG 生命周期定义了测试的初始化、执行和终止方式。它通过注解进行控制,这些注解为测试流程提供结构和清晰度。

注解 描述 执行命令
@BeforeSuite 在测试套件中的所有测试之前运行。 1
@BeforeTest 执行于之前 <test> XML 中的标签 2
@BeforeClass 在当前类中的第一个方法之前运行 3
@BeforeMethod 在每个测试方法之前执行 4
@Test 包含实际测试逻辑 5
@AfterMethod 每个测试方法之后运行 6
@AfterClass 在类中的所有方法之后运行 7
@AfterTest <test> XML 中的标签 8
@AfterSuite 在套件中的所有测试之后执行 9

这种结构化的顺序确保了可预测的测试设置和拆卸,这对保持测试独立性至关重要。


3) 怎么样 TestNG 来自不同 JUnit?

虽然这两个框架都用于单元测试, TestNG 提供更强大的配置和并行执行能力。

专栏 JUnit TestNG
并行执行 有限的支持 全力支持
注释 较少(@Before, @After) 更富有(@BeforeSuite, @DataProvider)
依赖管理 不可用 可用 dependsOnMethods
分组 不支持 支持使用 groups
参数化 通过外部跑者 通过 XML 内置或 @DataProvider

综上所述, TestNG 是首选 企业级自动化测试 以及与诸如此类的工具的集成 Selenium,而 JUnit 非常适合简单的单元测试。


4)什么是 TestNG 注释是什么?注释有什么用?

中的注释 TestNG 定义 测试方法的结构和行为它们通过在代码中直接提供声明式测试控制,消除了对复杂 XML 配置的需求。

常用的注释包括:

  • @BeforeSuite, @BeforeTest, @BeforeClass, @BeforeMethod
  • @Test
  • @AfterMethod, @AfterClass, @AfterTest, @AfterSuite

计费示例:

@BeforeMethod
public void setup() {
    System.out.println("Initializing browser...");
}

@Test
public void verifyLogin() {
    System.out.println("Executing login test...");
}

这有助于开发人员以逻辑方式组织测试执行,确保设置、测试执行和清理按定义的顺序进行。


5)解释分组的概念 TestNG.

分组 TestNG 允许将测试逻辑地分类为更小、更易于管理的集合,例如“冒烟测试”、“回归测试”或“健全性测试”。

计费示例:

@Test(groups = {"Smoke"})
public void loginTest() { ... }
@Test(groups = {"Regression"})
public void paymentTest() { ... }

您可以配置 XML 套件以运行特定组:

<groups>
  <run>
    <include name="Smoke"/>
  </run>
</groups>

优点:

  • 便于选择性地执行测试用例。
  • 增强 CI/CD 流水线的灵活性。
  • 节省增量构建过程中的执行时间。

6)如何实现参数化? TestNG?

参数化实现了数据驱动测试,允许使用多个输入数据集运行测试。 TestNG 支持两种主要方法:

  1. 运用 @Parameters 使用 XML 进行注解:
  2. <parameter name="browser" value="chrome"/>
    @Test
    @Parameters("browser")
    public void launchBrowser(String browser) { ... }
    
  3. 运用 @DataProvider:
  4. @DataProvider(name="loginData")
    public Object[][] getData() {
      return new Object[][] {{"user1","pass1"}, {"user2","pass2"}};
    }
    
    @Test(dataProvider="loginData")
    public void loginTest(String user, String pass) { ... }
    

这种灵活性使得跨环境或配置维护和执行大型测试集变得更加容易。


7)什么是依赖关系? TestNG 它们是如何管理的?

依赖关系 TestNG 根据其他测试结果,控制测试执行顺序 dependsOnMethods or dependsOnGroups 属性。

计费示例:

@Test
public void loginTest() { ... }

@Test(dependsOnMethods = {"loginTest"})
public void verifyDashboard() { ... }

如果依赖方法失败,则自动跳过后续测试。

该机制可防止无效测试执行,并有助于维护 逻辑测试完整性它尤其适用于登录→执行操作→验证结果等多步骤功能流程。


8)有哪些不同的执行方式? TestNG 测试?

TestNG 根据测试环境的不同,测试可以通过多种灵活的方式执行:

  1. 从 IDE(Eclipse/IntelliJ): 右键单击类或 XML fileRun asTestNG Test.
  2. 从命令行: java -cp "path\testng.jar;bin" org.testng.TestNG testng.xml
  3. 使用构建工具:
    • 马文: 配置 surefire-plugin in pom.xml.
    • Gradle: 使用 VHDL 语言编写 testng 依赖关系和任务配置。
  4. 通过 CI/CD 流水线: 可与 Jenkins 或 GitHub Actions 集成,实现自动化执行。

这种多样性确保了在开发、测试和生产环境中的兼容性。


9)什么是 TestNG 听众是谁?他们为什么重要?

听众 TestNG 提供钩子,通过监控测试执行事件(如开始、成功、失败或跳过)来定制测试行为。

普通听众:

  • ITestListener:跟踪测试方法级别的事件。
  • ISuiteListener观察套件级别的事件。
  • IReporter生成自定义报告。

计费示例:

public class CustomListener implements ITestListener {
  public void onTestFailure(ITestResult result) {
    System.out.println("Test Failed: " + result.getName());
  }
}

监听器通常用于接收 失败截图,产生 自定义日志与报告工具集成 例如 Allure 或 ExtentReports。


10)使用 TestNG?

方面 性能 缺点
灵活性 支持分组、依赖关系和并行执行 大型套件的复杂 XML 设置
报告仪表板 提供详细的 HTML 和 XML 报告 没有监听器,自定义功能有限。
之路 与无缝协作 Selenium 以及 CI/CD 工具 学习曲线稍高
参数化 内置数据驱动测试支持 大型数据集需要维护

总体而言, TestNG 尽管配置开销较小,但它仍然是一个强大而灵活的框架,适用于现代自动化测试环境。


11)如何确定测试用例的优先级? TestNG?

TestNG 提供 priority 属性在 @Test 用于定义测试方法执行顺序的注解。优先级较低的测试会先执行。

计费示例:

@Test(priority = 1)
public void loginTest() { ... }

@Test(priority = 2)
public void dashboardTest() { ... }

如果未指定优先级,则默认值为 0方法按字母顺序执行。

最佳实践: 谨慎使用优先级值。过度使用优先级值会使测试顺序变得僵化。对于复杂的流程,依赖关系管理(dependsOnMethods)比严格的优先级排序更易于维护。


12)解释并行执行的概念和用途 TestNG.

并行执行 TestNG 允许同时运行多个测试、类或方法,从而显著减少整体执行时间。

您可以在以下位置启用此功能: testng.xml 文件:

<suite name="ParallelSuite" parallel="tests" thread-count="3">
  <test name="Test1">...</test>
  <test name="Test2">...</test>
</suite>

支持的并行模式:

  • tests
  • classes
  • methods
  • instances

优点:

  • 更快的反馈周期。
  • 高效利用多核处理器。
  • 大型自动化套件的可扩展性。

但是,请确保 线程安全 使用 WebDriver 或数据库连接等共享资源时。


13)数据提供商有哪些? TestNG它们与参数有何不同?

@DataProvider 使 数据驱动测试 通过向测试方法提供多组数据。

计费示例:

@DataProvider(name="credentials")
public Object[][] data() {
    return new Object[][] {{"user1", "pass1"}, {"user2", "pass2"}};
}

@Test(dataProvider="credentials")
public void login(String username, String password) { ... }

@Parameters 和 @DataProvider 的区别:

专栏 @Parameters @DataProvider
数据源 XML文件 Java 方法
数据类型 单个数据集 多个数据集
灵活性 Less
用例 环境变量 重复的数据驱动测试

因此, @DataProvider 当使用多个数据集执行单个测试时,例如使用多个凭据验证登录,建议使用这种方法。


14)如何禁用或跳过测试? TestNG?

您可以在以下位置禁用测试: TestNG 使用 enabled 可以通过属性或以编程方式跳过它。

1。 运用 enabled = false:

@Test(enabled = false)
public void skipTest() {
    System.out.println("This test will not run.");
}

2. 运行时跳过 SkipException:

@Test
public void conditionalSkip() {
    throw new SkipException("Skipping this test due to condition.");
}

禁用此功能很有用 暂时停用 跳过不稳定或不完整的测试,而不删除它们。跳过测试很有价值。 运行时条件例如,跳过对不支持的浏览器的测试。


15)testng.xml 文件的作用是什么?它的主要组成部分是什么?

这个 testng.xml 文件是配置的核心。 TestNG它定义了测试套件、测试组、参数和并行执行设置。

结构示例:

<suite name="AutomationSuite">
  <parameter name="browser" value="chrome"/>
  <test name="RegressionTests">
    <classes>
      <class name="com.test.LoginTest"/>
      <class name="com.test.PaymentTest"/>
    </classes>
  </test>
</suite>

主要成分:

  • <suite> – 定义整个套件。
  • <test> – 表示一个测试块。
  • <classes> – 列出测试类。
  • <methods> – 筛选特定测试方法。
  • <parameter> – 提供全局或测试级参数。

XML 文件提供 集中控制 过度执行而不更改代码。


16)如何生成报告? TestNG?

TestNG 自动生成 两种类型的报告:

  1. HTML报告 (test-output/index.html) – 汇总已通过、未通过和已跳过的测试。
  2. XML报告 – 用于与 CI/CD 工具集成。

对于高级报告, TestNG 集成:

  • ExtentReports – 提供图形化仪表盘和详细日志。
  • Allure 报道 – 提供带有测试步骤、屏幕截图和日志的可视化分析。

集成示例:

ExtentReports extent = new ExtentReports();
ExtentTest test = extent.createTest("Login Test");
test.pass("Test Passed Successfully");
extent.flush();

这些报告对于追踪趋势和发现测试覆盖率方面的薄弱环节至关重要。


17)什么是工厂? TestNG,以及它们如何工作?

工厂位于 TestNG 用于创建 测试类的动态实例它们允许在运行测试之前对类进行参数化实例化。

计费示例:

public class FactoryExample {
  private String browser;

  public FactoryExample(String browser) {
    this.browser = browser;
  }

  @Factory
  public static Object[] factoryMethod() {
    return new Object[] { new FactoryExample("Chrome"), new FactoryExample("Firefox") };
  }

  @Test
  public void testBrowser() {
    System.out.println("Running test on: " + browser);
  }
}

优点:

  • 启用 创建参数化对象.
  • 应用 跨浏览器测试多环境执行.
    当您需要不同的对象配置而不仅仅是方法级别的数据变化时,工厂可以作为数据提供程序的补充。

18)如何在……中使用断言 TestNG?

断言用于验证测试方法中的预期结果与实际结果是否一致。

断言类型:

  1. 硬断言(断言类):
    测试失败后立即停止测试执行。
  2. Assert.assertEquals(actual, expected);
    Assert.assertTrue(condition);
    
  3. 软断言(SoftAssert 类):
    即使失败也会继续执行,并在最后报告所有问题。
  4. SoftAssert soft = new SoftAssert();
        soft.assertEquals(actual, expected);
        soft.assertAll();
    
  5. 何时使用:
    • 使用硬断言 关键验证 例如登录成功。
    • 使用软断言 多重验证 在单一测试方法中。

19)解释 @BeforeMethod 和 @BeforeClass 之间的区别 TestNG.

方面 @BeforeMethod @BeforeClass
执行 运行 每次之前 测试方法 运行 以前一次 类中的任何方法
适用范围 每测试方法 每节测试课
一般用途 每次测试前都会初始化浏览器 加载配置或浏览器设置一次

计费示例:

@BeforeClass
public void setupClass() {
    System.out.println("Executed once per class");
}

@BeforeMethod
public void setupMethod() {
    System.out.println("Executed before each method");
}

使用 VHDL 语言编写 @BeforeMethod 每个测试都需要一个干净的环境,并且 @BeforeClass 用于可重用的繁重初始化任务。


20) 如何 TestNG 支持依赖注入,它有哪些应用场景?

TestNG 支持 依赖注入 通过内置方式注入上下文和配置对象,例如 ITestContext, XmlTestMethod.

计费示例:

@Test
public void testContextExample(ITestContext context) {
    System.out.println("Suite Name: " + context.getSuite().getName());
}

用例:

  • 动态获取测试参数。
  • 访问配置信息,例如套件名称或并行执行设置。
  • 增强测试灵活性,无需硬编码依赖项。

依赖注入允许开发人员 编写模块化、上下文感知的测试 能够动态适应环境变化。


21)@Factory 和 @DataProvider 之间有什么区别? TestNG?

以上皆是 @Factory@DataProvider 有助于参数化,但它们的运行方式是 不同层次 在测试架构中。

专栏 @Factory @DataProvider
适用范围 班级级别 方法级别
目的 创建具有不同数据的类的多个实例 向单一测试方法提供数据
执行 对每个实例执行整个类 多次执行同一个方法
理想的用例 跨浏览器或环境测试 数据驱动的功能测试

计费示例:

  • 工厂: 根据浏览器类型运行整个类。
  • 数据提供者: 使用多个数据集运行一个测试方法。

使用 VHDL 语言编写 @Factory 当对象实例化本身发生变化时,以及 @DataProvider 用于同一对象实例内的功能输入变化。


22) 如何自动重试失败的测试用例? TestNG?

TestNG 提供一种机制 重新运行失败的测试用例 使用 IRetryAnalyzer 界面。

示例实现:

public class RetryAnalyzer implements IRetryAnalyzer {
  int count = 0;
  int maxTry = 2;

  public boolean retry(ITestResult result) {
    if (count < maxTry) {
      count++;
      return true;
    }
    return false;
  }
}

用法:

@Test(retryAnalyzer = RetryAnalyzer.class)
public void testLogin() {
   Assert.fail("Intentional Failure");
}

优点:

  • 降低 CI 流水线的不稳定性。
  • 处理瞬态网络或环境问题。

最佳实践: 将重试逻辑与适当的日志记录和屏幕截图相结合,以便调试间歇性故障。


23) ITestContext 在什么情况下有用? TestNG?

ITestContext 提供 上下文信息 有关测试运行的信息,包括套件名称、测试名称、输出目录和参数。

计费示例:

@Test
public void contextExample(ITestContext context) {
    System.out.println("Suite: " + context.getSuite().getName());
}

关键方法:

  • getSuite() – 获取套房级别的信息。
  • getName() – 返回测试名称。
  • setAttribute() / getAttribute() – 在不同测试之间共享数据。

它使 跨测试方法或类的数据共享 并支持动态报告和日志记录。


24)如何在测试组之间创建依赖关系? TestNG?

您可以使用以下方式定义组间依赖关系: dependsOnGroups 属性在 @Test 注解。

计费示例:

@Test(groups = "Login")
public void login() { ... }

@Test(dependsOnGroups = "Login")
public void verifyProfile() { ... }

这确保了 verifyProfile 只有当所有测试都已完成时,该组才会运行。 Login 小组通过考核。

它在以下方面尤其有用: 集成测试其中,模块依赖于其他模块的成功执行(例如,登录→个人资料→注销流程)。


25)如何在测试中忽略某些测试方法? TestNG XML文件?

你可以明确 排除方法 在 XML 套件文件中的类中使用 <exclude> 标签。

计费示例:

<class name="com.test.LoginTests">
  <methods>
    <exclude name="verifyLogout"/>
  </methods>
</class>

这使得测试人员能够 暂时禁用特定方法 无需修改 Java 源代码——在大型套件中非常有用,因为需要根据发布周期或冲刺优先级动态地包含或排除某些组件。


26)如何 TestNG 与……结合 Selenium WebDriver?

TestNG 与 Selenium 为用户界面自动化形成强大的组合。

典型的集成设置包括使用注解组织测试、管理设置/拆卸以及通过 XML 或 CI 工具运行测试。

计费示例:

@BeforeMethod
public void setup() {
    driver = new ChromeDriver();
}

@Test
public void verifyTitle() {
    driver.get("https://example.com");
    Assert.assertEquals(driver.getTitle(), "Example Domain");
}

@AfterMethod
public void teardown() {
    driver.quit();
}

集成优势:

  • 启用 并行浏览器测试.
  • 简化 测试分组和报告.
  • 与无缝协作 CI / CD管道 例如 Jenkins 或 GitHub Actions。

27)使用时有哪些最佳实践? TestNG 在大型自动化框架中?

最佳实践:

  1. 使用 VHDL 语言编写 Descript命名: 根据行为而非实现方式命名测试。
  2. 杠杆分组: 创建逻辑测试组(冒烟测试、回归测试)。
  3. 避免硬编码: 使用参数或属性文件作为测试数据。
  4. 最小化依赖关系: 尽可能保持测试用例的独立性。
  5. 集中配置: 使用 VHDL 语言编写 testng.xml 用于套房设置。
  6. 整合报告: 使用监听器或第三方工具,例如 ExtentReports。
  7. 谨慎使用重试逻辑: 避免掩盖真正的缺陷。

遵循这些措施可确保 可扩展性、可维护性和可读性 在企业级自动化领域。


28) @BeforeTest 和 @BeforeSuite 有什么区别? TestNG?

专栏 @BeforeTest @BeforeSuite
适用范围 每个运行之前 <test> XML 中的标签 在整个套件运行之前运行一次
频率 多次(如果多次 <test> 块) 每套套房仅限一次
一般用途 初始化测试级配置 建立全球资源

计费示例:

@BeforeSuite
public void setupSuite() {
    System.out.println("Global setup for suite.");
}

@BeforeTest
public void setupTest() {
    System.out.println("Setup for each <test> tag.");
}

使用 VHDL 语言编写 @BeforeSuite HPMC胶囊 全局配置 (例如,数据库连接) @BeforeTest HPMC胶囊 测试特定的初始化.


29) 可以 TestNG 能否用于API测试?如何操作?

是的。 TestNG 可以有效地用于 API测试 通过与 HTTP 客户端库集成,例如 放心 or 客户端.

计费示例:

@Test
public void verifyApiResponse() {
    Response response = RestAssured.get("https://api.example.com/users");
    Assert.assertEquals(response.getStatusCode(), 200);
}

优点:

  • 启用 基于断言的验证 的回应。
  • 支持 参数化数据驱动测试 适用于多个端点。
  • 生成 结构化报告 用于 REST API 验证。

通过结合 TestNG 借助 RestAssured,测试人员可以维护一个统一的自动化框架,用于 UI 和 API 测试。


30)如何从命令行传递参数? TestNG?

您可以通过传递系统属性在运行时覆盖 XML 参数。 -D 旗。

命令示例:

mvn test -Dbrowser=chrome -Denv=staging

代码示例:

@Parameters("browser")
@Test
public void launch(@Optional("firefox") String browser) {
    System.out.println("Running on: " + browser);
}

这使 动态环境选择 在 CI/CD 管道中无需更改配置文件即可进行测试,从而增强测试灵活性。


31)如何控制测试执行顺序? TestNG 不使用优先级?

而不是使用 priority, TestNG 允许通过以下方式进行控制 依赖XML方法排序.

方法:

  1. 运用 dependsOnMethods:
  2. @Test
    public void login() { ... }
    
    @Test(dependsOnMethods = "login")
    public void verifyDashboard() { ... }
    
  3. 使用 XML 方法序列:
  4. <classes>
      <class name="com.test.LoginTests">
        <methods>
          <include name="login"/>
          <include name="verifyDashboard"/>
        </methods>
      </class>
    </classes>
    

最佳实践: 对于复杂的流程,应优先采用逻辑依赖关系而不是静态优先级,以确保测试套件的健壮性和可维护性。


32) 如何从命令行执行特定的测试方法? TestNG?

TestNG 允许 方法级测试执行 直接通过命令行使用 XML 或 Maven Surefire 配置。

方案一:使用 XML 文件

<class name="com.test.LoginTests">
  <methods>
    <include name="verifyLogin"/>
  </methods>
</class>

选项 2:Maven 命令

mvn test -Dtest=com.test.LoginTests#verifyLogin

这种方法允许 选择性执行可用于调试单个方法或在快速构建期间验证关键功能。


33)如何使用外部 Excel 文件对测试进行参数化? TestNG?

在测试数据频繁变化的数据驱动框架中,使用 Excel 进行参数化是很常见的。

实施步骤:

  1. 使用 VHDL 语言编写 阿帕奇兴趣点 or JExcel 读取Excel数据。
  2. 把它喂入 @DataProvider 方法。

计费示例:

@DataProvider(name = "excelData")
public Object[][] readExcel() throws Exception {
    FileInputStream fis = new FileInputStream("data.xlsx");
    XSSFWorkbook wb = new XSSFWorkbook(fis);
    XSSFSheet sheet = wb.getSheetAt(0);
    Object[][] data = new Object[sheet.getLastRowNum()][2];
    for (int i = 0; i < sheet.getLastRowNum(); i++) {
        data[i][0] = sheet.getRow(i + 1).getCell(0).getStringCellValue();
        data[i][1] = sheet.getRow(i + 1).getCell(1).getStringCellValue();
    }
    return data;
}

这样就可以使用来自 Excel 的多个真实世界数据集运行相同的测试方法,从而提高灵活性和覆盖范围。


34)你如何跑步 TestNG 在 Jenkins 或 CI/CD 流水线中进行测试?

TestNG 与以下产品无缝集成 詹金斯, 亚搏体育app CIGitHub动作 通过 Maven 或 Gradle 建立。

Jenkins 中的步骤:

  1. 安装 Maven集成插件.
  2. 创建一个 自由式或管道式工作.
  3. 添加 mvn clean test 作为构建步骤。
  4. 构建完成后,配置 HTML 报告:
    • 报告目录: test-output
    • 索引文件: index.html

优点:

  • 启用自动化回归测试。
  • 提供计划测试运行和趋势跟踪。
  • 确保在不同环境下执行一致的测试。

35) @Parameters 的用途是什么?它与 @Optional 有什么区别?

这两个注解都涉及参数化,但用途不同。

专栏 @Parameters @Optional
目的 从 XML 文件传递​​参数 如果参数缺失,则提供默认值
声明 与 XML 一起使用 <parameter> 内部测试方法
宠物行为研究 如果值缺失,则抛出错误 使用备用值

计费示例:

@Test
@Parameters("browser")
public void runTest(@Optional("chrome") String browser) {
    System.out.println("Running on: " + browser);
}

运用 @Optional 确保 测试稳定性 当 XML 配置不完整时。


36)如何处理不同类之间的测试依赖关系? TestNG?

要创建类间依赖关系, TestNG 允许使用 dependsOnGroups 属性。

计费示例:

@Test(groups = "Login")
public void loginTest() { ... }

@Test(groups = "Dashboard", dependsOnGroups = "Login")
public void dashboardTest() { ... }

这种方法有助于管理 多模块依赖关系 其中每个类代表一个模块(登录、仪表盘、支付等)。

它确保依赖模块仅在先决条件测试成功后才执行,从而维护测试的完整性。


37)什么是配置故障? TestNG以及应该如何处理这些问题?

当设置或拆卸方法带有注解时,会发生配置失败。 @Before* or @After* 失败。

它们可能导致 跳过依赖测试即使这些测试结果是正确的。

常见原因:

  • WebDriver初始化错误。
  • 数据库或环境配置问题。
  • 参数配置错误。

解决方案:

  • 使用 VHDL 语言编写 试着抓 设置方法中的代码块。
  • 入学申请 alwaysRun = true 确保即使发生故障也能运行清理程序。

计费示例:

@BeforeMethod(alwaysRun = true)
public void setup() {
    // Setup logic
}

这样可以确保你的拆卸方法仍然能够执行,从而保持测试环境的稳定性。


38) invocationCount 和 threadPoolSize 属性在什么情况下有用? TestNG?

这些属性允许 重复和并行测试执行 采用相同的方法。

计费示例:

@Test(invocationCount = 5, threadPoolSize = 2)
public void loadTest() {
    System.out.println("Running load test...");
}
属性 描述
invocationCount 方法运行次数
threadPoolSize 并发线程数

使用案例: 性能测试、稳定性验证或在多次运行中重现不稳定行为。


39)如何只运行失败的测试用例? TestNG?

经过一次套房跑之后, TestNG 生成一个名为的文件 testng-failed.xml ,在 test-output 目录。

您可以通过执行以下命令重新运行失败的测试:

java -cp testng.jar org.testng.TestNG test-output/testng-failed.xml

优点:

  • 通过跳过成功的测试来节省时间。
  • 便于对大型软件套件进行调试。
  • 常用于 CI 流水线中,以便快速重新测试。

您还可以使用构建后脚本将此功能与 Jenkins 集成,以便重新运行。


40)有哪些局限性? TestNG 如何减轻这些影响?

尽管它坚固耐用, TestNG 有一些局限性。

局限性 缓解策略
XML配置的复杂性 使用基于注解的配置和构建器
有限的本地报告 集成 ExtentReports 或 Allure
没有内置重试控制 实施 IRetryAnalyzer
并行运行中的线程安全问题 使用线程本地 WebDriver 实例
初学者的学习曲线 维护基于模板的项目结构

通过合理的框架设计和最佳实践,可以最大限度地减少这些限制,从而确保稳定且可维护的自动化解决方案。


41)如何使用监听器进行日志记录和屏幕截图? Selenium-TestNG?

听众 TestNG 帮助监控测试执行情况,并动态执行日志记录、屏幕截图或报告结果等操作。

示例实现:

public class ScreenshotListener implements ITestListener {
  @Override
  public void onTestFailure(ITestResult result) {
      WebDriver driver = ((BaseTest) result.getInstance()).getDriver();
      File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
      FileUtils.copyFile(src, new File("screenshots/" + result.getName() + ".png"));
  }
}

用法:

@Listeners(ScreenshotListener.class)
public class LoginTests extends BaseTest { ... }

优点:

  • 自动捕获故障。
  • 通过视觉证据改进调试过程。
  • 减少维护日志的人工工作量。

该技术在 CI/CD 自动化管道中至关重要,尤其是在远程诊断构建失败时。


42) IReporter 和 ITestListener 有什么区别? TestNG?

专栏 IReporter ITestListener
目的 测试执行后生成自定义报告 跟踪并响应运行时测试事件
调用 所有测试完成后 在测试生命周期中(开始、成功、失败)
输出 HTML/XML/JSON 报告 日志文件、屏幕截图、实时仪表盘
一般用途 ExtentReports 与 Allure 集成 日志记录、故障处理、重试机制

计费示例:

  • 使用 VHDL 语言编写 IReporter 用于建筑 综合报告 测试结束后。
  • 使用 VHDL 语言编写 ITestListener HPMC胶囊 实时日志记录或屏幕截图.

他们也可以 构建端到端自动化分析系统。


43) 如何使用以下方式执行跨浏览器测试 TestNG XML配置?

跨浏览器测试确保相同的功能在不同的浏览器上都能正常运行。

配置示例:

<suite name="CrossBrowserSuite" parallel="tests">
  <test name="ChromeTest">
    <parameter name="browser" value="chrome"/>
    <classes><class name="com.test.LoginTest"/></classes>
  </test>
  <test name="FirefoxTest">
    <parameter name="browser" value="firefox"/>
    <classes><class name="com.test.LoginTest"/></classes>
  </test>
</suite>

Java 代码:

@Parameters("browser")
@BeforeClass
public void setup(String browser) {
    if(browser.equalsIgnoreCase("chrome"))
        driver = new ChromeDriver();
    else if(browser.equalsIgnoreCase("firefox"))
        driver = new FirefoxDriver();
}

这种方法可以 并行、多浏览器执行加快跨平台测试覆盖率。


44)你如何整合 TestNG 使用 Docker 或 Selenium 网格?

TestNG 与以下产品无缝集成 Docker 化 Selenium 格 实现分布式并行测试。

步骤:

  1. 成立 Selenium Docker 中的网格 使用官方 Selenium 图片:
    docker run -d -p 4444:4444 --name selenium-grid selenium/standalone-chrome
  2. 更新 TestNG 设置:
  3. DesiredCapabilities caps = new DesiredCapabilities();
    caps.setBrowserName("chrome");
    driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), caps);
    
  4. 通过 Jenkins 或 CI 流水线执行您的套件。

优点:

  • 启用 可扩展并行测试.
  • 减少环境设置开销。
  • 提供 一致的测试执行 跨分布式容器。

45)在套件、测试和方法级别上并行执行有什么区别? TestNG?

水平 平行属性 执行行为
套件 parallel="suites" 同时执行多个测试套件
测试 parallel="tests" 运行 <test> 同时
增益级 parallel="classes" 并行运行测试类
付款方式 parallel="methods" 并行执行各个测试方法。

计费示例:

<suite name="ParallelTests" parallel="methods" thread-count="3">
  <test name="SampleTest">
    <classes><class name="com.test.ParallelExample"/></classes>
  </test>
</suite>

最佳实践:使用 VHDL 语言编写 parallel="classes" 为了稳定 Selenium 进行测试以避免共享驱动程序冲突。


46)如何在不使用全局变量的情况下在测试之间共享数据? TestNG?

TestNG 提供 ITestContext依赖注入 动态共享数据。

计费示例:

@Test
public void storeData(ITestContext context) {
    context.setAttribute("token", "abc123");
}

@Test(dependsOnMethods = "storeData")
public void useData(ITestContext context) {
    String token = (String) context.getAttribute("token");
    System.out.println("Using token: " + token);
}

这样可以避免使用静态变量,保持线程安全,并确保 跨测试的数据隔离.


47)如何捕获和记录跳过的测试? TestNG?

您可以使用以下方式捕获跳过的测试 onTestSkipped() ,在 ITestListener 界面。

计费示例:

@Override
public void onTestSkipped(ITestResult result) {
    System.out.println("Skipped Test: " + result.getName());
}

跳过原因:

  • 相关测试失败。
  • 通过条件跳过 SkipException.
  • 环境不可用。

最佳实践:
记录 CI 报告或仪表板中的跳过原因和堆栈跟踪,以便进行追溯。


48) 解释如何使用参数化REST API测试 TestNG 以及 RestAssured。

TestNG“ @DataProvider 与……优雅地融合 放心 用于 API 参数化。

计费示例:

@DataProvider(name = "apiData")
public Object[][] apiData() {
  return new Object[][] {
    {"https://api.example.com/users/1"},
    {"https://api.example.com/users/2"}
  };
}

@Test(dataProvider = "apiData")
public void testApi(String url) {
  Response response = RestAssured.get(url);
  Assert.assertEquals(response.getStatusCode(), 200);
}

优点:

  • 对多个端点或有效负载执行相同的 API 调用。
  • 简化了具有不同输入集的 API 的回归测试。
  • 与 CI 工具和报告无缝集成。

49)如何在……中创建自定义注释 TestNG 用于可重用的测试模式?

自定义注释可以规范重复的测试配置或验证。

计费示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SmokeTest {
  String description() default "Smoke Test";
}

用法:

@SmokeTest(description="Validating Login Functionality")
@Test
public void loginTest() { ... }

结合反射,您可以动态读取这些注解,从而对测试进行分组或驱动条件执行。

这项技术被广泛应用于 框架元编程 构建自文档化测试。


50)如何结合 Cucumber 与 TestNG 适用于混合测试框架吗?

TestNG 可以作为 测试运行程序 HPMC胶囊 Cucumber BDD场景,提供强大的报告和并行化功能。

示例运行器:

@CucumberOptions(
  features = "src/test/resources/features",
  glue = "stepDefinitions",
  plugin = {"pretty", "html:target/cucumber-report.html"}
)
public class RunCucumberTest extends AbstractTestNGCucumberTests { }

优点:

  • 利用 TestNG“ 注释、监听器和报告.
  • 支持 并行执行.
  • 与整合 绝世佳人ExtentReports 容易。

这种混合方法融合了 BDD 可读性 - TestNG 灵活性非常适合企业级框架。


🔍 顶部 TestNG 真实场景与战略应对的面试问题

以下是 10 个与领域相关的实际案例 TestNG 面试问题以及明确的期望和有力的答案示例。

1)你能解释一下使用的主要优势吗? TestNG 相比 JUnit?

对候选人的期望: 展现对以下内容的理解 TestNG的增强功能以​​及它为何经常成为企业自动化的首选。

示例答案: “TestNG 它提供了诸多优势,例如灵活的测试配置、支持并行执行、依赖测试方法、使用数据提供程序进行数据驱动测试以及内置报告功能。这些功能使其具有诸多优势。 TestNG 对于需要可扩展性的复杂自动化框架而言,它的功能更加强大。”


2)如何使用 TestNG 使用注解来控制测试执行流程?

对候选人的期望: 了解注释的目的和顺序。

示例答案: “TestNG 提供了诸如 @BeforeSuite、@BeforeClass、@BeforeMethod、@Test 及其对应的清理注解注解等注解。这些注解允许对测试设置和清理工作进行结构化组织。例如,@BeforeMethod 注解会在每个测试方法执行之前运行,这对于初始化浏览器状态非常有用。


3)描述一个具有挑战性的自动化项目,其中 TestNG 发挥了关键作用。

对候选人的期望: 具备实际项目经验和解决问题的能力。

示例答案: “在我之前的职位上,我参与了一个需要在多个环境下进行大量回归测试的项目。 TestNG的并行执行和分组功能使团队能够同时运行关键测试套件,在保持可靠性的同时显著缩短执行时间。”


4) 怎样做 TestNG 团队协作有助于高效地组织和执行测试吗?

对候选人的期望: 理解分组,包括包含/排除机制。

示例答案: “团体” TestNG 允许对测试用例进行分类,例如冒烟测试、回归测试和集成测试。通过使用 testng.xml,我可以选择运行测试组、排除不稳定的测试,并在不修改代码本身的情况下管理不同的测试套件。


5)描述一下你遇到的需要调试失败的情况。 TestNG 测试。你的方法是什么?

对候选人的期望: 批判性思维和问题解决能力。

示例答案: “在之前的职位上,我遇到了一系列失败的 TestNG 有些测试在本地运行正常,但在持续集成(CI)环境中却失败了。我启用了详细日志记录,检查了执行顺序,发现测试之间共享资源没有被重置。然后,我使用 @AfterMethod 实现了正确的清理步骤,以确保测试隔离。


6) 如何使用数据驱动测试来实现 TestNG?

对候选人的期望: 了解数据提供者和使用案例。

示例答案: “我创建了一个 @DataProvider 方法,该方法以对象数组的形式返回数据,然后使用 dataProvider 属性将其绑定到一个 @Test 方法。这样就可以使用不同的输入集对同一测试进行多次迭代,这对于验证表单提交或 API 有效负载的变化非常有用。”


7) 您如何管理测试依赖项? TestNG?

对候选人的期望: 正确使用 dependsOnMethods 或 dependsOnGroups。

示例答案: “TestNG 允许通过 dependsOnMethods 和 dependsOnGroups 属性设置测试依赖关系。当一个测试必须在另一个测试成功完成后才能执行时,我会使用依赖关系,例如,只有在创建订单后才能验证订单。


8)描述你是如何使用 TestNG 使用持续集成工具。

对候选人的期望: 实际自动化流水线经验。

示例答案: 在我上一份工作中,我整合了…… TestNG 通过配置 Maven 构建,使用 Jenkins 生成 TestNG Jenkins 会生成 HTML 和 XML 格式的报告。然后,Jenkins 会将这些报告存档,并在每次构建周期结束后显示结果。这种集成帮助团队快速跟踪故障并保持版本稳定性。


9)请描述一下您在时间紧迫的情况下管理多个自动化任务的经历。

对候选人的期望: 时间管理能力和优先排序能力。

示例答案: “在我上一份工作中,我需要更新现有系统。” TestNG 我维护了现有的测试套件,同时还为即将发布的版本创建新的测试套件。我根据业务影响对任务进行优先级排序,首先自动化风险最高的领域,并使用 TestNG 将已完成的部分分组,以便尽早审核。这既保证了按时交付,又没有影响质量。”


10)你会如何设计一个可扩展的 TestNG 大型应用程序的框架?

对候选人的期望: Archi结构理解、模式和最佳实践。

示例答案: 我会使用页面对象模型设计一个模块化框架,并将其集成到系统中。 TestNG 对于执行管理,我会使用 DataProvider,对于数据驱动的场景,我会使用 DataProvider。此外,我还会配置并行执行、集中管理实用程序,并将配置设置外部化,以确保框架在应用程序增长时仍能保持可扩展性和可维护性。

总结一下这篇文章: