【问题标题】:Accessing Method Parameters or return value of a method访问方法参数或方法的返回值
【发布时间】:2015-11-09 09:09:33
【问题描述】:

我想获得 JUnit 测试的结果。保存在TestResult类中,是TestCase类的run方法的返回值,也是TestCase类的run方法的参数。

JUnit的TestResult类和TestCase类请看这个链接。

http://junit.sourceforge.net/doc/cookstour/cookstour.htm

我可以在测试运行时访问 TestCase 类。

我的问题是:是否可以在方法运行完成时访问方法的参数,还是可以在方法执行后获取方法的返回值?

我正在为我的论文做方面编程。在那里我可以访问 TestCase 类。当执行测试用例方法时。无论测试是通过还是失败,我都想得到它的结果。这样我就可以使用这些信息。如何以编程方式获取测试结果?

这里是示例代码:

    pointcut allMethodsRun() : execution(* *.*(..));
    pointcut testClasses() : within(junit.framework.TestCase+);


 after() :  testClasses() && allMethodsRun() {   
     System.out.println(((TestCase) thisJoinPoint.getThis()).run()  );        

这里我可以访问 TestCase 类,但是如何在测试方法执行后获得测试结果。有什么想法或问题吗?

类似

【问题讨论】:

  • 您可以使用测试侦听器:junit.sourceforge.net/javadoc/org/junit/runner/notification/…,但不清楚您要完成什么以及为什么。这似乎是您可以存储在一个简单的日志文件中并在事后阅读的那种信息。
  • 其实我只能访问 TestCase 类。假设我只有要运行的 Junit 测试和程序的源代码。我通过 eclipse 插件运行测试,点击运行测试套装,我想访问测试结果。我该怎么做?
  • 如果您使用的是 Eclipse 插件,在 JUnit 视图中有一个简单的导出结果选项,它会为您提供一个 XML 结果文件。

标签: java junit aop aspectj


【解决方案1】:

Andrew 是绝对正确的,但是对于它的价值,你想看到一个 AOP 解决方案,所以我在 AspectJ 中为你准备了一个。但是我不喜欢旧的 JUnit 风格,所以我准备了一个使用 @Test 注释而不是继承自 TestCase 的 JUnit 4 测试用例。我认为您应该熟悉 JUnit 4,因为它已经存在了足够长的时间并且是当今的标准。

被测类(非常琐碎):

package de.scrum_master.app;

public class Calculator {
    public static int add(int summand1, int summand2) {
        return summand1 + summand2;
    }

    public static int subtract(int minuend, int subtrahend) {
        return minuend - subtrahend;
    }

    public static int multiply(int factor1, int factor2) {
        return factor1 * factor2;
    }

    public static int divide(int dividend, int divisor) {
        return dividend / divisor;
    }
}

JUnit 4 测试有一个失败的断言和一个产生计划外运行时错误的测试:

package de.scrum_master.app;

import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {
    @Test
    public void testAdd() {
        assertEquals(33, Calculator.add(11, 22));
        assertEquals(12, Calculator.add( 4,  8));
        assertEquals(11, Calculator.add(11,  0));
    }

    @Test
    public void testSubtract() {
        assertEquals(33, Calculator.subtract(44, 11));
        assertEquals(12, Calculator.subtract(12,  0));
        assertEquals(11, Calculator.subtract(19,  8));
    }

    @Test
    public void testMultiply() {
        assertEquals(33, Calculator.multiply( 3, 11));
        assertEquals(12, Calculator.multiply( 4,  3));
        // This assertion should fail
        assertEquals(11, Calculator.subtract(10,  5));
    }

    @Test
    public void testDivide() {
        assertEquals(33, Calculator.divide(99, 3));
        assertEquals(12, Calculator.divide(51, 4));
        // This call should cause an exception
        assertEquals(11, Calculator.divide(11, 0));
    }
}

方面捕获成功和失败的测试:

package de.scrum_master.aspect;

import org.junit.Test;

public aspect TestResultInterceptor {
    pointcut testMethods() :
        execution(@Test public void *(..));

    after() returning : testMethods() {
        System.out.println(
            "Test OK: " +
            thisJoinPointStaticPart.getSignature()
        );
    }

    after() throwing (Throwable throwable) : testMethods() {
        System.out.println(
            (throwable instanceof AssertionError ? "Test failed: " : "Error during test: ") +
            thisJoinPointStaticPart.getSignature()
        );
        System.out.println("  " + throwable);
    }
}

运行 JUnit 测试时的控制台日志:

Test OK: void de.scrum_master.app.CalculatorTest.testAdd()
Test OK: void de.scrum_master.app.CalculatorTest.testSubtract()
Error during test: void de.scrum_master.app.CalculatorTest.testDivide()
  java.lang.ArithmeticException: / by zero
Test failed: void de.scrum_master.app.CalculatorTest.testMultiply()
  java.lang.AssertionError: expected:<11> but was:<5>

【讨论】:

    【解决方案2】:

    如果您正在执行如上所示的测试,检测成功/失败就足够简单了。如果 .run() 抛出 AssertionError 则测试失败,如果 run() 抛出其他错误,则测试有错误,否则测试成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多