以编程方式从测试用例中删除 try/catch 个块
Programatically Remove try/catch blocks from test cases
我正在为一个研究项目检测测试代码。我们从测试用例开始,例如
@Test
public void test025() throws Throwable {
if (debug)
System.out.format("%n%s%n", "RegressionTest1.test025");
java.lang.Double[] d_array2 = new java.lang.Double[] { 1.0d, (-1.0d) };
org.apache.commons.math.linear.ArrayRealVector arrayRealVector3 = new org.apache.commons.math.linear.ArrayRealVector(d_array2);
org.apache.commons.math.linear.ArrayRealVector arrayRealVector4 = new org.apache.commons.math.linear.ArrayRealVector(d_array2);
try {
org.apache.commons.math.linear.ArrayRealVector arrayRealVector7 = new org.apache.commons.math.linear.ArrayRealVector(d_array2, (int) '4', (int) ' ');
org.junit.Assert.fail("Expected exception of type org.apache.commons.math.exception.NumberIsTooLargeException");
} catch (org.apache.commons.math.exception.NumberIsTooLargeException e) {
}
org.junit.Assert.assertNotNull(d_array2);
}
断言语句从 .java 文件中注释掉:
original = original.replace("org.junit.Assert.", "//org.junit.Assert.");
original = original.replace("assert", "//assert");
然后,他们使用 javassist 来记录任何异常(以确保它们发生在所有 运行 的测试用例中):
for (CtMethod testmethod : methods) {
if (testmethod.getName().startsWith("test")) {
try {
testmethod.insertBefore("semanticrt.statedump.dumpObjectState.setDumpTestCase(\""+testClassName+ "." + testmethod.getName()+"\");");
CtClass etype = null;
try {
etype = pool.get("java.lang.Exception");
} catch (NotFoundException e) {
e.printStackTrace();
}
String exceptionCode = "{ semanticrt.statedump.dumpObjectState.dumpExceptionToFile($e, " +
"\"" + outputFileRoot + "."+ testmethod.getName() + ".exception\", false); throw $e; }\n";
testmethod.addCatch(exceptionCode, etype);
} catch (CannotCompileException e) {
System.out.println(testmethod);
e.printStackTrace();
}
}
}
产生:
@Test
public void test025() throws Throwable {
try {
dumpObjectState.setDumpTestCase("RegressionTest1.test025");
if(debug) {
System.out.format("%n%s%n", new Object[]{"RegressionTest1.test025"});
}
Double[] var1 = new Double[]{Double.valueOf(1.0D), Double.valueOf(-1.0D)};
new ArrayRealVector(var1);
new ArrayRealVector(var1);
try {
new ArrayRealVector(var1, 52, 32);
} catch (NumberIsTooLargeException var6) {
;
}
} catch (Exception var7) {
dumpObjectState.dumpExceptionToFile(var7, "/home/loren/repos/d4jBugs/Math_45/version/XMLOut//out-RegressionTest1.test025.exception", false);
}
}
我的问题是 NumberIsTooLargeException
被代码中留下的 try/catch 块吞没了。 (注意:异常 class 可以是任何 class,这只是一个有问题的案例的示例。)所以我需要一种方法来摆脱生成测试中的任何 try/catch 块在我把它们包裹在我的之前的案例。
有谁知道如何使用 javassist 或者我可以在 .java 文件上 运行 删除它们之前使用的一个很好的正则表达式?
我想结束:
@Test
public void test025() throws Throwable {
try {
dumpObjectState.setDumpTestCase("RegressionTest1.test025");
if(debug) {
System.out.format("%n%s%n", new Object[]{"RegressionTest1.test025"});
}
Double[] var1 = new Double[]{Double.valueOf(1.0D), Double.valueOf(-1.0D)};
new ArrayRealVector(var1);
new ArrayRealVector(var1);
new ArrayRealVector(var1, 52, 32);
} catch (Exception var7) {
dumpObjectState.dumpExceptionToFile(var7, "/home/loren/repos/d4jBugs/Math_45/version/XMLOut//out-RegressionTest1.test025.exception", false);
}
}
我找到了一个有效的解决方案。它不会删除 try/catch 块,但会在 catch 的开头添加一个 throw 以提供所需的功能。
testmethod.instrument(
new ExprEditor() {
public void edit(Handler m)
throws CannotCompileException
{
m.insertBefore("throw ;");
}
}
);
这使得整个循环:
for (CtMethod testmethod : methods) {
if (testmethod.getName().startsWith("test")) {
try {
testmethod.instrument(
new ExprEditor() {
public void edit(Handler m)
throws CannotCompileException
{
m.insertBefore("throw ;");
}
}
);
testmethod.insertBefore("semanticrt.statedump.dumpObjectState.setDumpTestCase(\""+testClassName+ "." + testmethod.getName()+"\");");
CtClass etype = null;
try {
etype = pool.get("java.lang.Exception");
} catch (NotFoundException e) {
e.printStackTrace();
}
// See addCatch() https://jboss-javassist.github.io/javassist/tutorial/tutorial2.html
String exceptionCode = "{ semanticrt.statedump.dumpObjectState.dumpExceptionToFile($e, " +
"\"" + outputFileRoot + "."+ testmethod.getName() + ".exception\", false); return; }\n";
testmethod.addCatch(exceptionCode, etype);
} catch (CannotCompileException e) {
System.out.println(testmethod);
e.printStackTrace();
}
}
}
我正在为一个研究项目检测测试代码。我们从测试用例开始,例如
@Test
public void test025() throws Throwable {
if (debug)
System.out.format("%n%s%n", "RegressionTest1.test025");
java.lang.Double[] d_array2 = new java.lang.Double[] { 1.0d, (-1.0d) };
org.apache.commons.math.linear.ArrayRealVector arrayRealVector3 = new org.apache.commons.math.linear.ArrayRealVector(d_array2);
org.apache.commons.math.linear.ArrayRealVector arrayRealVector4 = new org.apache.commons.math.linear.ArrayRealVector(d_array2);
try {
org.apache.commons.math.linear.ArrayRealVector arrayRealVector7 = new org.apache.commons.math.linear.ArrayRealVector(d_array2, (int) '4', (int) ' ');
org.junit.Assert.fail("Expected exception of type org.apache.commons.math.exception.NumberIsTooLargeException");
} catch (org.apache.commons.math.exception.NumberIsTooLargeException e) {
}
org.junit.Assert.assertNotNull(d_array2);
}
断言语句从 .java 文件中注释掉:
original = original.replace("org.junit.Assert.", "//org.junit.Assert.");
original = original.replace("assert", "//assert");
然后,他们使用 javassist 来记录任何异常(以确保它们发生在所有 运行 的测试用例中):
for (CtMethod testmethod : methods) {
if (testmethod.getName().startsWith("test")) {
try {
testmethod.insertBefore("semanticrt.statedump.dumpObjectState.setDumpTestCase(\""+testClassName+ "." + testmethod.getName()+"\");");
CtClass etype = null;
try {
etype = pool.get("java.lang.Exception");
} catch (NotFoundException e) {
e.printStackTrace();
}
String exceptionCode = "{ semanticrt.statedump.dumpObjectState.dumpExceptionToFile($e, " +
"\"" + outputFileRoot + "."+ testmethod.getName() + ".exception\", false); throw $e; }\n";
testmethod.addCatch(exceptionCode, etype);
} catch (CannotCompileException e) {
System.out.println(testmethod);
e.printStackTrace();
}
}
}
产生:
@Test
public void test025() throws Throwable {
try {
dumpObjectState.setDumpTestCase("RegressionTest1.test025");
if(debug) {
System.out.format("%n%s%n", new Object[]{"RegressionTest1.test025"});
}
Double[] var1 = new Double[]{Double.valueOf(1.0D), Double.valueOf(-1.0D)};
new ArrayRealVector(var1);
new ArrayRealVector(var1);
try {
new ArrayRealVector(var1, 52, 32);
} catch (NumberIsTooLargeException var6) {
;
}
} catch (Exception var7) {
dumpObjectState.dumpExceptionToFile(var7, "/home/loren/repos/d4jBugs/Math_45/version/XMLOut//out-RegressionTest1.test025.exception", false);
}
}
我的问题是 NumberIsTooLargeException
被代码中留下的 try/catch 块吞没了。 (注意:异常 class 可以是任何 class,这只是一个有问题的案例的示例。)所以我需要一种方法来摆脱生成测试中的任何 try/catch 块在我把它们包裹在我的之前的案例。
有谁知道如何使用 javassist 或者我可以在 .java 文件上 运行 删除它们之前使用的一个很好的正则表达式?
我想结束:
@Test
public void test025() throws Throwable {
try {
dumpObjectState.setDumpTestCase("RegressionTest1.test025");
if(debug) {
System.out.format("%n%s%n", new Object[]{"RegressionTest1.test025"});
}
Double[] var1 = new Double[]{Double.valueOf(1.0D), Double.valueOf(-1.0D)};
new ArrayRealVector(var1);
new ArrayRealVector(var1);
new ArrayRealVector(var1, 52, 32);
} catch (Exception var7) {
dumpObjectState.dumpExceptionToFile(var7, "/home/loren/repos/d4jBugs/Math_45/version/XMLOut//out-RegressionTest1.test025.exception", false);
}
}
我找到了一个有效的解决方案。它不会删除 try/catch 块,但会在 catch 的开头添加一个 throw 以提供所需的功能。
testmethod.instrument(
new ExprEditor() {
public void edit(Handler m)
throws CannotCompileException
{
m.insertBefore("throw ;");
}
}
);
这使得整个循环:
for (CtMethod testmethod : methods) {
if (testmethod.getName().startsWith("test")) {
try {
testmethod.instrument(
new ExprEditor() {
public void edit(Handler m)
throws CannotCompileException
{
m.insertBefore("throw ;");
}
}
);
testmethod.insertBefore("semanticrt.statedump.dumpObjectState.setDumpTestCase(\""+testClassName+ "." + testmethod.getName()+"\");");
CtClass etype = null;
try {
etype = pool.get("java.lang.Exception");
} catch (NotFoundException e) {
e.printStackTrace();
}
// See addCatch() https://jboss-javassist.github.io/javassist/tutorial/tutorial2.html
String exceptionCode = "{ semanticrt.statedump.dumpObjectState.dumpExceptionToFile($e, " +
"\"" + outputFileRoot + "."+ testmethod.getName() + ".exception\", false); return; }\n";
testmethod.addCatch(exceptionCode, etype);
} catch (CannotCompileException e) {
System.out.println(testmethod);
e.printStackTrace();
}
}
}