目录
经验总结
1.比赛策略
2.看清楚题目
3.建议从简单的 基础类开始测试
4.快捷键的使用
5.测试用例如果抛出异常的。建议@Test使用expected参数。可以增加变异测试得分
6.建议测试用例增加超时时间限制。防止某个用例卡死
7.合理运用辅助工具
8.抽象类的方法如何测试
9 仔细阅读代码的帮助,会给你很多启发
10. 打好基础
11. 相似类的测试代码相似
12 通过循环增加测试覆盖率
13 使用反射来访问私有方法
14.掌握泛型的使用
经验总结
1.比赛策略
不必准求完美,几个小时的时间,目标是尽可能提高覆盖率,不追求100%
好比地上掉了很多钱,马上要刮大风了,请问你怎么捡? 捡大钱是一个比较不错的策略。
不要卡在一个地方,先做灰的,毕竟时间很有限。
2.看清楚题目
确定到底是语句覆盖(statement cover) 还是 判定覆盖(brance cover)
要求不同,测试用例编写的量不一样
3.建议从简单的 基础类开始测试
找到继承关系可以方便你在用某个类的实例时,快速的从对应的用例中拷贝过来
4.快捷键的使用
1)eclipse增加联想
2)// ctrl+2 L 可以快速为表达式补充等号及左侧的变量定义部分,这可以提高编码速度。
3)
5.测试用例如果抛出异常的。建议@Test使用expected参数。可以增加变异测试得分
为了较容易通过可以将异常类设置为 Exception.class
如果实在有困难。可以采用 try catch
因为那样可能会由于不抛出异常而failure
@Test
public void test5() {
try { // 这样子就不用太多时间考虑异常类型,至少程序不崩溃
test code writer here
} catch (Exception e) {
// e.printStackTrace(); //测试时可让最新的那个用例的改句打开,以了解代码的异常路径
}
}
6.建议测试用例增加超时时间限制。防止某个用例卡死
7.合理运用辅助工具
例如,安装覆盖率插件,可以随时了解目前源代码覆盖情况,哪些地方未覆盖
cfg插件、
借助sourceinsight超找类、调用关系等
8.抽象类的方法如何测试
1)如果子类未覆盖抽象父类的方法,那么直接通过具体子类的实例调用父类的方法。
2)如果子类已经覆盖了抽象父类的方法,导致父类方法无法被调用,可以自己定义具体子类继承和实现抽象父类,从而在自己定义的类中写方法来调用父类的方法
9 仔细阅读代码的帮助,会给你很多启发
代码中有一些范例,帮助你快速理解代码
10. 打好基础
java大一的基础课再好好复习下
建议把抽象类、类的继承、函数重写、输入输出流、数组、列表等看看
11. 相似类的测试代码相似
有些类结构相似,可能只是类型不同,这时可以考虑将用例复制过来,批量替换类型
具体还要自己衡量那个效率高,是自己重写,还是修改
12 通过循环增加测试覆盖率
程序运行的快,通过循环可以测试多个数,从而提高覆盖率,
13 使用反射来访问私有方法
被测程序的类的私有成员函数无法直接调用,可以通过反射的方式获取方法,修改方法的可访问性,然后再调用方法。
//被测试方法为private方法。私有方法不能通过对象条用,无法直接测试
public class DFSCodeTraveler {
....
private void dfsSearch(Stack<Integer> stack, int currentPosition, int next) {
}
....
}
try {
Stack<Integer> mystack = new Stack<Integer>();
mystack.push(0);
mystack.push(1);
Class<DFSCodeTraveler> dfsclass1 = DFSCodeTraveler.class;//得到被测类
// public Method getDeclaredMethod(String name,
// Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException
// 该方法将类中符合指定方法名称、指定方法参数的方法返回,函数的参数含义如下
// 参数:name - 方法名
// parameterTypes - 方法的参数类型列表
Method method = dfsclass1.getDeclaredMethod("dfsSearch",
new Class[] { mystack.getClass(), int.class, int.class });
System.out.println(method.toString()); //此处只是打印卡线函数是否正确
method.setAccessible(true); //修改方法为可范根
method.invoke(dfs2, mystack, 0, 0); //调用该方法 第一个参数为类的对象,后面的参数都是这个私有方法需要的参数
} catch (Exception e) {
System.out.println(e.toString());
}
14.掌握泛型的使用
15. 参数化
参数化测试允许开发人员使用不同的值反复运行同一个测试。按照5 个步骤来创建参数化测试。
1)用 @RunWith(Parameterized.class) 来注释 test 类。
2)创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
3)创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
4)为每一列测试数据创建一个实例变量。
5)用实例变量作为测试数据的来源来创建你的测试用例。
15. 建议更新maven依赖
本地执行测试程序时,可能提示
java.lang.NoClassDefFoundError: Lcom_atlassian_clover/TestNameSniffer;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
。。。。
此时,再