2013-05-02 61 views
0

我写自动生成的单元测试例。应用程序的应用程序需要输入一个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(); 
+1

'new Exception()'在您的代码中的一行中创建。所以它当然会在你的代码中引用该行。是否有任何理由创建自己的测试框架,而不是使用其中的一种标准测试框架,例如JUnit的? – 2013-05-02 11:10:53

+2

我怀疑代码覆盖是如何完成或完全可以完成的。我想你可能需要一个VM代理来做一些低级别的跟踪。 – millimoose 2013-05-02 11:16:23

回答

0

您可以阅读覆盖工具如何收集他们的统计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)); 
    } 
} 

您将无法产生由单独的方法签名的代码进行测试。你将不得不引入测试数据,这些数据可以很好地定义它适用于哪种方法,但是除了这样的简单情况之外,数据将成为测试用例,你所取得的所有成果都是引入了一个额外的复杂层。

在一天结束时,单元测试是在测试规范可以被定义得很好的测试数据。