黑盒测试实战:等价类与边界值法设计 4 组测试用例(附 C 语言代码)
黑盒测试实战等价类与边界值法设计 4 组测试用例附 C 语言代码在软件测试领域黑盒测试是一种不关心内部实现细节仅通过输入和输出来验证系统功能的测试方法。对于初学者而言掌握等价类划分和边界值分析这两种经典的黑盒测试技术至关重要。本文将以一个计算直角三角形斜边长的函数为例详细讲解如何设计高质量的测试用例。1. 理解待测函数功能首先我们需要明确待测函数calcEdge的具体功能要求// 计算直角三角形的斜边长度 float calcEdge(float a, float b, float area);该函数接收两个浮点数参数a和b分别表示直角三角形的两条直角边。根据函数说明我们需要注意以下几点当a或b小于0时函数应返回-1正常情况下应返回正确的斜边长度根据勾股定理计算参数area在本次测试中暂不考虑2. 等价类划分法设计测试用例等价类划分法的核心思想是将输入数据划分为若干等价类每个等价类中的数据对于发现程序错误是等效的。我们需要同时考虑有效等价类和无效等价类。2.1 识别等价类对于calcEdge函数我们可以划分以下等价类输入条件有效等价类无效等价类参数aa 0a ≤ 0参数bb 0b ≤ 0有效组合a0且b0a≤0或b≤02.2 设计测试用例根据等价类划分我们设计4组测试用例void testEquivalencePartitioning() { // 有效等价类测试用例 calcEdge(3, 4, 5); // 典型直角三角形 calcEdge(5, 12, 13); // 另一组常见直角三角形 // 无效等价类测试用例 calcEdge(-1, 4, -1); // a为负值 calcEdge(3, -1, -1); // b为负值 }测试要点说明有效等价类用例验证正常输入时的正确计算无效等价类用例验证对非法输入的处理每组测试都包含了预期输出值作为断言依据3. 边界值分析法设计测试用例边界值分析法关注输入范围的边界情况因为大量错误往往发生在边界附近。对于浮点数输入我们需要考虑以下边界3.1 识别边界条件零值边界0是正负数的分界点极小正值接近0的正数极大值虽然函数没有上限但需要考虑浮点数精度3.2 设计测试用例void testBoundaryValueAnalysis() { // 边界值测试用例 calcEdge(0, 1, -1); // a正好等于0 calcEdge(1, 0, -1); // b正好等于0 calcEdge(0.0001, 1, 1); // a接近0的正值 calcEdge(1, 0.0001, 1); // b接近0的正值 calcEdge(-0.0001, 1, -1); // a接近0的负值 calcEdge(1, -0.0001, -1); // b接近0的负值 }测试要点说明测试正好等于边界值的情况0测试刚刚超过和低于边界值的情况±0.0001验证边界条件下的正确处理4. 两种方法的对比与结合使用虽然等价类划分和边界值分析都是黑盒测试方法但它们各有侧重方法关注点优势局限性等价类划分输入数据的分类减少测试用例数量可能遗漏边界情况边界值分析输入范围的边界发现边界相关错误不关注非边界的一般情况在实际测试中我们通常结合使用这两种方法void combinedTestCases() { // 等价类划分用例 testEquivalencePartitioning(); // 边界值分析用例 testBoundaryValueAnalysis(); // 补充用例边界附近的典型值 calcEdge(FLT_MIN, FLT_MIN, sqrt(2)*FLT_MIN); // 最小正浮点数 calcEdge(FLT_MAX, FLT_MAX, INFINITY); // 最大浮点数(可能溢出) }5. 完整测试代码示例下面是一个完整的测试示例包含了测试框架和断言检查#include stdio.h #include math.h #include float.h #include assert.h float calcEdge(float a, float b, float expected) { if (a 0 || b 0) { return -1; } return sqrt(a*a b*b); } void testEquivalencePartitioning() { // 有效等价类 assert(fabs(calcEdge(3, 4, 5) - 5) 0.0001); assert(fabs(calcEdge(5, 12, 13) - 13) 0.0001); // 无效等价类 assert(calcEdge(-1, 4, -1) -1); assert(calcEdge(3, -1, -1) -1); } void testBoundaryValueAnalysis() { // 边界值 assert(calcEdge(0, 1, -1) -1); assert(calcEdge(1, 0, -1) -1); assert(fabs(calcEdge(0.0001, 1, 1) - 1) 0.0001); assert(calcEdge(-0.0001, 1, -1) -1); } int main() { printf(Running equivalence partitioning tests...\n); testEquivalencePartitioning(); printf(Running boundary value analysis tests...\n); testBoundaryValueAnalysis(); printf(All tests passed!\n); return 0; }代码说明使用assert宏进行结果验证浮点数比较考虑精度误差测试用例分类组织便于维护包含清晰的测试输出信息6. 测试设计经验分享在实际项目中设计黑盒测试用例时有几点经验值得注意参数组合测试当有多个参数时要考虑参数间的组合情况错误推测根据经验预测可能出错的地方增加针对性测试特殊值测试如NaN、INF等特殊浮点值性能边界测试极大值时的性能表现例如可以补充以下测试用例// 特殊值测试 assert(calcEdge(NAN, 1, -1) -1); // 非数字输入 assert(calcEdge(INFINITY, 1, INFINITY)); // 无限大输入 // 性能测试 clock_t start clock(); calcEdge(1e30, 1e30, sqrt(2)*1e30); clock_t end clock(); printf(Large value calculation took %f seconds\n, (double)(end - start)/CLOCKS_PER_SEC);掌握等价类划分和边界值分析这两种基础方法后可以进一步学习更高级的黑盒测试技术如决策表测试、状态转换测试等以构建更完善的测试体系。