1. 程式人生 > >Java測試技巧

Java測試技巧

輸入 key 異常 pre exc gpo 項目 print project

快捷鍵

修改快捷鍵 window-》preference-》general-》keys:
查找引用:ctrl+shift+g
覆蓋測試:alt+shift+E,T
復制一行:ctrl+alt+down
調試運行:alt+shift+D,T
改為:
查找引用:ctrl+g
覆蓋測試:ctrl+W
復制一行:ctrl+d
調試運行:ctrl+q

概念

變異(數字、返回值、errMsg)
循環用例(BinarySearchTree test2)
容易出現變異的地方(自定義異常)
多個測試用例
用反射(復制對比,Datalog hasCode)
我的測試步驟(代碼最多、私有函數)
使用eclipse代碼模板
半自動化測試:生成隨機數據、記錄隨機數據來跑分支,記錄對應的結果來斷言

bug檢測率

  針對特定的應用場景,寫好了測試用例,運行測試用例,發現程序的行為和測試用例中預期的不一致,則稱這個程序出bug了。

  行為不一致的具體表現為:返回值、運算符、條件判斷、數值(引用、數字、字符串變化)等。這些在項目升級或者完善的時候容易出現,這時,測試用例就派上用場了,能用於檢測升級後是否出現了bug。

  如何檢測測試用例的有效性呢?主要指標是分支(語句)覆蓋率和bug檢測率。以上可見,bug出現在項目升級或者完善時,改動而來的變化,但在實際應用中不可能等到項目升級了才來檢測用例是否有效,有工具可以來模擬這些變化,這些變化則稱之為“變異”,將程序輸入,進行變異後,輸出多份代碼。每份代碼都認為出現了bug,因為裏面的部分代碼被工具改動了,即和原來的項目代碼表現不一致了。用這些變異後的代碼運行測試用例,要求測試用例運行失敗,這樣才算是檢測出bug了,否則都通過的話,則沒檢測出bug。

插件

覆蓋率插件:eclemma
變異插件:http://muclipse.sourceforge.net/site/site.xml
https://sourceforge.net/projects/muclipse/?source=typ_redirect

反射例子

package refExample;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception{
        
        Class clazz 
= A.class; { //調用有參靜態方法 Method f1 = clazz.getDeclaredMethod("f2", new Class[]{int.class}); f1.setAccessible(true); f1.invoke(null, 123); } { //調用無參靜態方法 Method f1 = clazz.getDeclaredMethod("f2", null); f1.setAccessible(true); f1.invoke(null, null); } { //設置靜態屬性 Field field = clazz.getDeclaredField("aa"); field.setAccessible(true); field.set(null, 7); Method f1 = clazz.getDeclaredMethod("f1",null); f1.setAccessible(true); f1.invoke(null, null); } { //設置成員屬性 A a = (A) clazz.newInstance(); Field field = clazz.getDeclaredField("a"); field.setAccessible(true); field.set(a, 99); Method f1 = clazz.getDeclaredMethod("f3",null); f1.setAccessible(true); f1.invoke(a, null); } } } class A{ private static int aa; private static void f1(){ System.out.println(aa); } private static void f2(int a){ System.out.println(a); } private static void f2(){ System.out.println("no p 2 "); } private int a; private void f3(){ System.out.println(a); } }

Java測試技巧