获取的代码行数执行
问题描述:
我写自动生成的单元测试例。应用程序的应用程序需要输入一个java文件,然后处理的它找到它的所有方法。然后使用以下命令使用测试数据调用这些方法。 method.invoke(classObj,MethodArg); 现在我希望找到在被调用的方法中执行的行来计算覆盖范围。我已经尝试使用StackTrace()来完成此操作,但它提供了我的应用程序代码的行号。 任何人都可以帮助我。我完全彻底迷失了。任何帮助将不胜感激。 我当前的代码是:获取的代码行数执行
Runnable myRunnable;
myRunnable = new Runnable(){
public void run(){
try {
int returnValInt = (int) fm.invoke(fobj, fargs);
System.out.println(new Exception().getStackTrace()[0].getLineNumber());
} catch (IllegalAccessException ex) {
Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
Thread th= new Thread(myRunnable, "th");
th.start();
答
您可以阅读覆盖工具如何收集他们的统计here。
但在这之前,你正在做的是不会是太大的用处 - 在任何测试的整点是为了测试一段代码的意图。要做到这一点,你需要知道边界是什么,你期望的结果是什么。
例如:
public class Math
{
public static long add(long a, long b)
{
return a + b;
}
public static long multiply(long a, long b)
{
return a * b;
}
}
public class MathTest
{
@Test
public void testAdd()
{
assertTrue(5, Math.add(2, 3));
}
@Test
public void testMultiply()
{
assertTrue(6, Math.multiply(2, 3));
}
}
您将无法产生由单独的方法签名的代码进行测试。你将不得不引入测试数据,这些数据可以很好地定义它适用于哪种方法,但是除了这样的简单情况之外,数据将成为测试用例,你所取得的所有成果都是引入了一个额外的复杂层。
在一天结束时,单元测试是在测试规范可以被定义得很好的测试数据。
'new Exception()'在您的代码中的一行中创建。所以它当然会在你的代码中引用该行。是否有任何理由创建自己的测试框架,而不是使用其中的一种标准测试框架,例如JUnit的? – 2013-05-02 11:10:53
我怀疑代码覆盖是如何完成或完全可以完成的。我想你可能需要一个VM代理来做一些低级别的跟踪。 – millimoose 2013-05-02 11:16:23