`

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

    博客分类:
  • 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提供的工具来编写高效的单元测试。通过分析和运行源码,你可以了解如何将这些概念应用于实际项目,提高代码质量。...

    Junit单元测试学习资料

    Junit是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便的方式来验证他们的代码是否按预期工作。单元测试是软件开发中的一个重要环节,它的目的是确保代码的每一个小部分(即“单元”)都能...

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

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

    Java单元测试JUnit4.7

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

    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