`

使用代码方式运行指定单元测试类及方法

    博客分类:
  • Test
阅读更多
记一下, 备忘
    private void runTest(String className, String... methodNames) throws Exception {
        assert StringUtils.isNotBlank(className);
        Class<?> testClass = Class.forName(className);
        Runner runner = getRunner(testClass);
        if (runner instanceof Suite) {
            SuiteClasses ann = testClass.getAnnotation(Suite.SuiteClasses.class);
            Class<?>[] testClasses = ann.value();
            for (Class<?> clazz : testClasses) {
                run(clazz, getRunner(clazz), methodNames);
            }
        } else {
            run(testClass, runner, methodNames);
        }
    }

    private Runner getRunner(Class<?> testClass) {
        Request request = Request.aClass(testClass);
        Runner runner = request.getRunner();
        return runner;
    }

    private void run(Class<?> testClass, Runner runner, String... methodNames) throws NoSuchMethodException,
            NoSuchFieldException, IllegalAccessException {
        if (runner instanceof IgnoredClassRunner)
            return;

        JUnit4ClassRunner j4Runner = (JUnit4ClassRunner) runner;
        Class<?> runnerClass = j4Runner.getClass();
        while (runnerClass != JUnit4ClassRunner.class) {
            runnerClass = runnerClass.getSuperclass();
            if (runnerClass == Object.class) {
                break;
            }
        }
        if (methodNames != null && methodNames.length != 0) {
            String fielName = "fTestMethods";
            Field fTestMethods = runnerClass.getDeclaredField(fielName);
            if (fTestMethods == null) {
                throw new RuntimeException(String.format("the runner class[%s]'s field[%s] is not existed!",
                        runnerClass,
                        fielName));
            }
            List<Method> methods = new ArrayList<Method>(methodNames.length);
            for (String methodName : methodNames) {
                if (StringUtils.isBlank(methodName))
                    continue;

                Method testMethod = testClass.getDeclaredMethod(methodName);
                methods.add(testMethod);
            }
            fTestMethods.setAccessible(true);
            fTestMethods.set(j4Runner, methods);
        }
        JUnitCore core = new JUnitCore();
        core.addListener(getRunListener());
        core.run(runner);
    }

    private RunListener getRunListener() {
        return new RunListener() {
            @Override
            public void testRunStarted(Description description) throws Exception {
                logger.debug("开始测试类" + description.getDisplayName());
            }

            @Override
            public void testRunFinished(Result result) throws Exception {
                logger.debug("测试结束" + "\n");
            }

            @Override
            public void testStarted(Description description) throws Exception {
                logger.debug("\t开始测试方法:" + description.getDisplayName());
            }

            @Override
            public void testFinished(Description description) throws Exception {
                logger.debug("\t结束测试方法");
            }

            @Override
            public void testFailure(Failure failure) throws Exception {
                Throwable exception = failure.getException();
                logger.error("", exception);
            }
        };
    }
分享到:
评论

相关推荐

    java单元测试篇:使用clover为java代码的junit测试做覆盖率分析.pdf

    需要在 build.xml 文件中添加 JUnit 任务,指定 JUnit 的 classpath 和测试类的位置。然后,使用 Ant 运行 JUnit 测试,生成测试报告。 使用 Clover 生成覆盖率报告 使用 Clover,可以生成详细的单元测试覆盖率...

    在Eclipse中使用JUnit4进行单元测试

    测试类通常会继承自`org.junit.Test`注解的基类,并且每个测试方法都会使用`@Test`注解标记。 JUnit4引入了注解,使得测试更加简洁。例如,`@Before`和`@After`注解用于定义在每个测试方法之前和之后执行的代码,...

    junit单元测试使用方法(实例)

    ### JUnit单元测试使用方法详解 #### 一、JUnit简介及意义 JUnit 是一个流行的 Java 编程语言的单元测试框架。它最初由 Erich Gamma 和 Kent Beck 创建,旨在简化软件开发过程中的测试工作。单元测试是软件开发...

    android不用另建工程进行单元测试及改变测试方法执行顺序示例代码

    JUnit是一个广泛使用的Java测试框架,它允许我们定义测试类和测试方法来验证代码的正确性。Mockito则是一个强大的模拟库,可以让我们在测试中隔离依赖,使得我们可以专注于测试单个组件的功能。 在Android Studio中...

    VS2010单元测试工具使用

    VS会自动生成一个测试类和测试方法的框架。 - 添加单元测试项目:在“解决方案资源管理器”中,右键点击解决方案,选择“添加新项目”,然后选择“Visual C#测试”下的“单元测试项目”。 2、编写测试方法: 测试...

    Junit 单元测试完整案例

    在案例中,你将看到如何创建测试类,定义测试方法,设置测试数据,以及如何利用JUnit和Spring/Struts提供的工具来编写高效的单元测试。通过分析和运行源码,你可以了解如何将这些概念应用于实际项目,提高代码质量。...

    使用ant脚本编译并运行junit单元测试,并生成测试报告

    4. 使用`junit`任务运行测试,指定测试类,并配置输出为XML格式。 5. 使用`junitreport`任务根据XML输出生成HTML测试报告。 通过这种方式,开发者可以高效地进行自动化构建,确保代码质量,并且便于团队成员共享和...

    Java单元测试JUnit4.7

    6. **测试套件(Test Suites)**:允许组合多个测试类或测试方法到一个测试套件中,方便批量运行。 7. **规则(Rules)**:JUnit 4.7引入了规则概念,允许自定义行为,比如资源管理、事务处理等,这些规则可以在每...

    VS2010单元测试工具使用.doc

    其中包含了一个使用`[TestClass]`标记的测试类和一个使用`[TestMethod]`标记的测试方法。 **示例代码**: ```csharp [TestClass] public class ProgramTest { [TestMethod] public void AddTest() { // 测试...

    java eclipse 单元测试

    在这个测试类中,我们将使用 JUnit 提供的注解和方法来编写测试用例。 ```java import org.junit.Test; import static org.junit.Assert.assertEquals; public class MathUtilTest { @Test public void ...

    Android添加单元测试的方法与步骤

    使用JUnit进行Android单元测试时,需要注意,因为Android SDK提供的JUnit版本可能不包含完整的实现,所以可能需要在运行配置中指定JRE,并添加JUnit库。如果在Eclipse中,可以通过`Run Configurations`来调整`...

    单元测试junit-jar包

    使用Junit,我们可以创建独立于应用程序主流程的测试类和方法,这些测试不会影响到其他部分的代码。每个测试方法应该专注于测试一个特定的功能或行为,这样一旦发现错误,定位问题会更加快捷。 在不启动完整服务的...

    使用VS2005进行单元测试

    3. 创建新的测试项目,VS2005会自动生成对应的测试类和测试方法。 4. 编写测试代码,调用`Assert`类的方法来验证方法的输出。 例如,在MSDM2005的Bank项目中,可以创建单元测试来检验`BankAccount`类的`Debit()`和`...

    单元测试之道Java版使用JUnit

    JUnit的核心概念包括测试类、测试方法和断言。测试类通常会有一个与被测类相对应,用于包含各种测试方法。测试方法是带有@Test注解的方法,每个方法对应一个独立的测试场景。断言(Assertion)则是用来判断预期结果...

    junit4.7单元测试

    通过 `@Test(expected = Exception.class)`,可以直接指定测试方法预期抛出的异常类型,简化了异常处理的测试。 5. **超时测试**: 使用 `@Test(timeout =毫秒数)` 注解,可以设置测试方法的最大执行时间,如果...

    SpringMvc单元测试Junit

    测试类应该继承`SpringBootTest`类,并使用`@WebAppConfiguration`注解来指定测试的web应用配置。同时,利用`@Autowired`注解注入`MockMvc`实例。 3. **编写测试方法**:每个测试方法代表一个特定的测试场景。使用`...

Global site tag (gtag.js) - Google Analytics