# java
1、可变与不可变
- String是不可变类型,而StringBuilder是可变的。
- 此外,final表示不可变引用,它可以引用可变值,如StringBuilder,尽管它的引用不能改变。
2、java集合
- List:包括计算元素数量 (
lst.size()
)、添加元素 (lst.add(e)
) 和检查是否为空 (lst.isEmpty()
) 等用例。 - Map:包括放置元素 (
map.put(key, val)
)、获取元素 (map.get(key)
)、检查键是否存在 (map.containsKey(key)
) 和移除元素 (map.remove(key)
) 等操作。 - Set:包括检查成员关系 (
s1.contains(e)
)、子集存在 (s1.containsAll(s2)
) 和集合差异 (s1.removeAll(s2)
) 等方法。 - 数组创建:展示使用
Arrays.asList
创建数组的不同方式。 - 迭代 map:
for (String key : turtles.keyset()) {
System.out.println(key + ": " + turtles.get(key));
}
- Java I/O:
java.io.File //表示磁盘上的文件,测试是否可读,删除文件等
java.io.FileReader // 阅读文本文件
java.io.BufferedReader // 有效阅读文本,可以一次阅读整行
#测试 BigInteger.multiply()
public BigInteger multiply(BigInteger val)
- 用法示例:
BigInteger a = ...; BigInteger b = ...; BigInteger ab = a.multiply(b);
- 分区设计:
- a 和 b 均为正数
- a 和 b 均为负数
- a 为正数,b 为负数
- a 为负数,b 为正数
- 特殊情况:0、1、-1
- 使用非常大的整数,大于最大的 long 类型整数
- 设计(a, b) 空间
a 和 b 是独立的变量,每个变量的设计考虑以下情况:
- 0
- 1
- -1
- 小的正整数
- 小的负整数
- 非常大的正整数
- 非常大的负整数
3、在分区中包括边界
错误通常发生在子域边界处。
常见的边界情况包括:
- 0 是正数和负数之间的边界。
- 数值类型的最大值和最小值,例如 int 和 double。
- 集合类型的空性(空字符串、空列表、空数组)。
- 集合的第一个和最后一个元素。
例如,测试 public static int max(int a, int b)
:
(1, 2)
:覆盖 a < b,a > 0,b > 0。(-1, -3)
:覆盖 a > b,a < 0,b < 0。(0, 0)
:覆盖 a = b,a = 0,b = 0。(Integer.MIN_VALUE, Integer.MAX_VALUE)
:覆盖 a < b,a = minint,b = maxint。(Integer.MAX_VALUE, Integer.MIN_VALUE)
:覆盖 a > b,a = maxint,b = minint。
4、黑盒和白盒测试
黑盒测试
- 仅从规范中选择测试用例,而不从功能代码实现中选择。
白盒测试
- 基于代码的测试。
- 如果实现根据输入选择不同的算法,应根据这些域进行分区。
- 对于未明确要求的实现行为,测试用例不需要包含。
白盒测试示例
/**
* Sort a list of integers in nondecreasing order. Modifies the list so that
* values.get(i) <= values.get(i+1) for all 0 <= i < values.length()-1
*/
public static void sort(List<Integer> values) {
// 根据列表大小选择合适的算法
if (values.size() < 10) {
radixSort(values);
} else if (values.size() < 1000000000) {
quickSort(values);
} else {
mergeSort(values);
}
}
测试情况:当数组长度为 10 时
// values = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
// 这个测试情况依赖于对代码实现的理解。
5、覆盖范围
-
语句覆盖(Statement Coverage):确保每个语句都至少由一个测试用例执行。
-
分支覆盖(Branch Coverage):确保每个条件语句(如 if 或 while)的每个分支都至少被测试到,包括正确和错误的方向。
-
路径覆盖(Path Coverage):确保测试涵盖了程序中所有可能的路径,包括每个分支的所有可能组合。
6、集成测试
程序可能会在模块之间的连接上失败,集成测试将测试模块组合。
7、自动化测试
定期运行测试并自动检查其结果可以有效防止程序在修复新错误或添加新功能时引入其他错误的退化。
这种做法有助于:
- 自动化测试:确保测试能够自动运行和检查结果,提高测试效率和可靠性。
- 持续集成和持续部署(CI/CD):通过集成自动化测试到开发流程中,及时发现潜在问题,保证代码质量。
- 快速反馈:在每次代码变更后立即运行测试,快速获取反馈,帮助开发人员及时修复问题。
8、回归测试
在修复错误后,将包含错误样例的输入用于自动化测试是回归测试的一部分。回归测试旨在确保在进行更改或修复后,软件的现有功能仍然正常工作,同时避免已修复的错误再次出现。
在回归测试中包含错误样例的输入有助于:
- 验证修复:确保修复措施有效,错误不再发生。
- 防止再次发生:通过检查相同或类似的错误样例,预防同类问题再次出现。
- 充分覆盖:确保新修复不会导致其他部分的功能受影响。
9、总结
测试覆盖标准
- 语句覆盖(Statement Coverage):确保每个语句至少被一个测试用例执行。
- 分支覆盖(Branch Coverage):确保每个条件语句的所有分支(包括正确和错误的方向)都至少被测试到。
- 路径覆盖(Path Coverage):确保测试覆盖了程序中所有可能的路径,包括每个条件语句的所有可能组合。
通过这些覆盖标准,可以全面验证程序的正确性和稳定性,确保在各种情况下程序行为符合预期。
自动化测试和回归测试
在更改代码时,定期运行测试并自动检查其结果可以有效防止引入新错误。这种做法有助于:
- 自动化测试:提高测试效率和可靠性,确保测试能够自动运行和检查结果。
- 持续集成和持续部署(CI/CD):集成自动化测试到开发流程中,及时发现潜在问题,保证代码质量。
- 快速反馈:在每次代码变更后立即运行测试,快速获取反馈,帮助及时修复问题。