java 获取父类中dataprovider的方法引发的异常

hwamh0ep  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(117)

我有一个扩展CommonTest类的TestClass,在测试类的@Dataprovider中有一个方法doSomething()失败了。我想在@AfterClass中捕获堆栈跟踪,而不使用@DataProvider中的try/catch

class CommonTest {

    @AfterClass
    captureFailures() {
    }

}

class TestClass {

    @DataProvider
    sampleMethod() {

        CommonUtils.doSomething()

    }

}

class CommonUtils {

    doSomething()

}
gr8qqesn

gr8qqesn1#

要在不使用try/catch的情况下捕获@DataProvider中失败方法的堆栈跟踪,可以使用TestNG提供的ITestResult对象。下面是CommonTest类中captureFailures()方法的示例实现:

@Dataprovider
    class CommonTest {
        private static List<Throwable> failures = new ArrayList<>();
    
        @AfterMethod
        public void afterMethod(ITestResult result) {
            if (result.getStatus() == ITestResult.FAILURE) {
                failures.add(result.getThrowable());
            }
        }
    
        @AfterClass
        public void captureFailures() {
            if (!failures.isEmpty()) {
                System.out.println("Failures captured in @DataProvider:");
                for (Throwable failure : failures) {
                    failure.printStackTrace();
                }
            }
        }
    }
    
    class TestClass extends CommonTest {
        @DataProvider
        public Object[][] sampleMethod() {
            CommonUtils.doSomething();
            return new Object[][]{{}};
        }
    }
    
    class CommonUtils {
        public static void doSomething() {
            throw new RuntimeException("Failed to do something");
        }
    }

在这个实现中,我们使用ArrayList来存储由afterMethod()方法捕获的任何Throwable对象。在每个测试方法之后调用此方法,包括用@DataProvider注解的方法。如果测试结果失败,我们将Throwable对象添加到failures列表中。
captureFailures()方法中,我们检查failures列表是否不为空。如果有任何失败,我们将打印出列表中每个Throwable对象的堆栈跟踪。
请注意,我们还将CommonTest类抽象化,并将其扩展到TestClass类中。这是因为我们希望使用CommonTest类中的afterMethod()方法来捕获TestClass@DataProvider方法中的失败。

7vux5j2d

7vux5j2d2#

如果@DataProvider方法失败,则可能无法调用@AfterMethod或@AfterClass方法,因此您可能无法获取ITestResult对象。在这种情况下,可以使用ITestContext对象存储在@DataProvider方法中引发的异常,然后在@AfterMethod或@AfterClass方法中检索它。下面是一个示例实现:

class CommonTest {
    @AfterMethod
    captureFailures(ITestResult result) {
        Throwable throwable = result.getThrowable();
        if (throwable != null) {
            // Log or handle the exception here
        }
    }

    @AfterClass
    captureFailures(ITestContext context) {
        Throwable throwable = context.getFailedTests().getAllResults().stream()
                .map(ITestResult::getThrowable)
                .filter(Objects::nonNull)
                .findFirst()
                .orElse(null);
        if (throwable != null) {
            // Log or handle the exception here
        }
    }
}

class TestClass {
    @DataProvider
    sampleMethod() {
        try {
            CommonUtils.doSomething();
        } catch (Throwable t) {
            throw new SkipException("Skipping test due to exception in data provider", t);
        }
    }
}

class CommonUtils {
    static void doSomething() {
        // Your code here
    }
}

请注意,此实现假设您使用的测试框架支持ITestContext和SkipException对象,例如TestNG。如果您没有使用这样的框架,则可能需要相应地修改实现。

相关问题