访问方法参数或方法的 return 值
Accessing Method Parameters or return value of a method
我想获得 JUnit 测试的结果。它保存在 TestResult class 中,它是 TestCase class 的 运行 方法的 return 值,也是 TestCase class 的 运行 方法的参数.
JUnit 的 TestResult Class 和 TestCase class 请参阅此 link。
http://junit.sourceforge.net/doc/cookstour/cookstour.htm
当测试为 运行 时,我可以访问 TestCase class。
我的问题是:是否可以在方法 运行 完成时访问方法的参数,或者我可以在方法执行后获取方法的 return 值吗?
我正在为我的论文做方面编程。在那里我可以访问 TestCase class。当执行测试用例方法时。无论测试通过还是失败,我都想得到它的结果。这样我就可以使用这些信息。如何以编程方式获取测试结果?
这里是示例代码:
pointcut allMethodsRun() : execution(* *.*(..));
pointcut testClasses() : within(junit.framework.TestCase+);
after() : testClasses() && allMethodsRun() {
System.out.println(((TestCase) thisJoinPoint.getThis()).run() );
在这里我可以访问TestCase class 但是我如何在测试方法执行后得到测试结果。有任何想法或问题吗?
喜欢
如果您正在执行如上所示的测试,检测 success/failure 就足够简单了。如果 .运行() 抛出 AssertionError 则测试失败,如果 运行() 抛出其他东西则测试有错误,否则测试成功。
Andrew 是完全正确的,但不管怎样,你希望看到一个 AOP 解决方案,所以我在 AspectJ 中为你准备了一个。但我不喜欢旧的 JUnit 风格,所以我准备了一个 JUnit 4 测试用例,使用 @Test
注释而不是从 TestCase
继承。我认为您应该熟悉 JUnit 4,因为它已经存在了足够长的时间并且是当今的标准。
Class 正在测试中(非常琐碎):
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>
我想获得 JUnit 测试的结果。它保存在 TestResult class 中,它是 TestCase class 的 运行 方法的 return 值,也是 TestCase class 的 运行 方法的参数.
JUnit 的 TestResult Class 和 TestCase class 请参阅此 link。
http://junit.sourceforge.net/doc/cookstour/cookstour.htm
当测试为 运行 时,我可以访问 TestCase class。
我的问题是:是否可以在方法 运行 完成时访问方法的参数,或者我可以在方法执行后获取方法的 return 值吗?
我正在为我的论文做方面编程。在那里我可以访问 TestCase class。当执行测试用例方法时。无论测试通过还是失败,我都想得到它的结果。这样我就可以使用这些信息。如何以编程方式获取测试结果?
这里是示例代码:
pointcut allMethodsRun() : execution(* *.*(..));
pointcut testClasses() : within(junit.framework.TestCase+);
after() : testClasses() && allMethodsRun() {
System.out.println(((TestCase) thisJoinPoint.getThis()).run() );
在这里我可以访问TestCase class 但是我如何在测试方法执行后得到测试结果。有任何想法或问题吗?
喜欢
如果您正在执行如上所示的测试,检测 success/failure 就足够简单了。如果 .运行() 抛出 AssertionError 则测试失败,如果 运行() 抛出其他东西则测试有错误,否则测试成功。
Andrew 是完全正确的,但不管怎样,你希望看到一个 AOP 解决方案,所以我在 AspectJ 中为你准备了一个。但我不喜欢旧的 JUnit 风格,所以我准备了一个 JUnit 4 测试用例,使用 @Test
注释而不是从 TestCase
继承。我认为您应该熟悉 JUnit 4,因为它已经存在了足够长的时间并且是当今的标准。
Class 正在测试中(非常琐碎):
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>