用Python+Excel自动化解决三角形测试难题:从决策表到一键生成测试用例

每次手动绘制三角形问题的决策表时,你是否也感到效率低下且容易出错?作为软件测试工程师,我们经常需要处理这类经典但繁琐的测试场景。传统方法不仅耗时,还难以保证覆盖率。今天,我将分享如何用Python和Excel打造一个自动化工具,5分钟内完成过去需要半小时的手工工作。

1. 理解三角形问题的决策逻辑

在开始编码前,我们需要彻底理清三角形问题的判断逻辑。一个有效的三角形必须满足任意两边之和大于第三边。在此基础上,我们还需要判断它是普通三角形、等腰三角形还是等边三角形。

关键判断条件

  • 是否构成三角形(a+b>c且a+c>b且b+c>a)
  • 是否有两边相等(a==b或b==c或c==a)
  • 是否三边全等(a==b==c)

把这些条件转化为决策表的条件桩,我们可以得到以下真值组合:

条件组合 构成三角形 a==b b==c c==a 预期结果
1 N - - - 不构成三角形
2 Y N N N 普通三角形
3 Y Y N N 等腰三角形(a=b)
4 Y N Y N 等腰三角形(b=c)
5 Y N N Y 等腰三角形(c=a)
6 Y Y Y N 等边三角形
7 Y Y N Y 等边三角形
8 Y N Y Y 等边三角形
9 Y Y Y Y 等边三角形

提示:在实际应用中,我们可以合并一些规则。例如,所有不构成三角形的情况可以合并为一条规则,因为后续条件不影响结果。

2. Python实现自动化决策表生成

现在,让我们用Python将这些逻辑转化为可执行的代码。我们将创建一个函数,输入三边长度,自动判断三角形类型并生成对应的测试用例。

def analyze_triangle(a, b, c):
    # 检查输入是否有效
    if not all(isinstance(x, (int, float)) for x in [a, b, c]) or any(x <= 0 for x in [a, b, c]):
        return "无效输入", None
    
    # 判断是否能构成三角形
    is_triangle = (a + b > c) and (a + c > b) and (b + c > a)
    if not is_triangle:
        return "不构成三角形", {"构成三角形": False, "a==b": None, "b==c": None, "c==a": None}
    
    # 判断三角形类型
    ab_eq = (a == b)
    bc_eq = (b == c)
    ca_eq = (c == a)
    
    if ab_eq and bc_eq and ca_eq:
        return "等边三角形", {"构成三角形": True, "a==b": True, "b==c": True, "c==a": True}
    elif ab_eq or bc_eq or ca_eq:
        return "等腰三角形", {"构成三角形": True, "a==b": ab_eq, "b==c": bc_eq, "c==a": ca_eq}
    else:
        return "普通三角形", {"构成三角形": True, "a==b": False, "b==c": False, "c==a": False}

def generate_test_cases():
    test_cases = [
        (1, 2, 3),  # 不构成三角形
        (3, 4, 5),  # 普通三角形
        (5, 5, 7),  # 等腰三角形(a=b)
        (5, 7, 5),  # 等腰三角形(a=c)
        (7, 5, 5),  # 等腰三角形(b=c)
        (6, 6, 6),  # 等边三角形
        (0, 1, 1),  # 无效输入
        (2, 2, 4)   # 不构成三角形(2+2=4)
    ]
    
    results = []
    for case in test_cases:
        result, details = analyze_triangle(*case)
        results.append({
            "输入": case,
            "预期输出": result,
            "详细条件": details
        })
    
    return results

这段代码的核心是analyze_triangle函数,它接受三个参数(三角形的三边长度),返回三角形类型和详细的判断条件。generate_test_cases函数则预定义了一组测试用例,自动生成完整的测试报告。

代码优势

  1. 自动化判断:无需人工分析每个测试用例的预期结果
  2. 详细记录:不仅返回结果,还记录每个判断条件的真值
  3. 可扩展性:轻松添加新的测试用例或判断逻辑

3. Excel公式实现决策逻辑

对于习惯使用Excel的测试工程师,我们也可以用公式实现相同的功能。假设我们在Excel中设置以下结构:

A列: 边a B列: 边b C列: 边c D列: 三角形类型 E列: 构成三角形 F列: a=b G列: b=c H列: c=a

在D2单元格(三角形类型)中输入以下公式:

=IF(OR(A2<=0,B2<=0,C2<=0),"无效输入",
 IF(AND(A2+B2>C2,A2+C2>B2,B2+C2>A2),
    IF(AND(A2=B2,B2=C2),"等边三角形",
       IF(OR(AND(A2=B2),AND(B2=C2),AND(C2=A2)),"等腰三角形","普通三角形")),
    "不构成三角形"))

在E2到H2单元格中分别输入以下公式来记录判断条件:

E2: =IF(OR(A2<=0,B2<=0,C2<=0),NA(),AND(A2+B2>C2,A2+C2>B2,B2+C2>A2))
F2: =IF(ISNA(E2),NA(),A2=B2)
G2: =IF(ISNA(E2),NA(),B2=C2)
H2: =IF(ISNA(E2),NA(),C2=A2)

Excel方案的优势

  1. 无需编程知识:适合不熟悉Python的团队成员
  2. 即时可视化:输入边长即可立即看到结果
  3. 便于分享:Excel文件可以轻松共享和协作

4. 进阶:自动化测试用例生成与报告

结合Python的强大功能,我们可以进一步自动化整个测试流程。下面的代码展示了如何自动生成所有可能的测试用例组合,并输出专业的测试报告。

import pandas as pd
from itertools import product

def generate_comprehensive_cases(min_side=1, max_side=10):
    # 生成所有可能的边长组合
    side_values = range(min_side, max_side+1)
    all_combinations = list(product(side_values, repeat=3))
    
    # 分析每个组合
    test_results = []
    for combo in all_combinations:
        result, details = analyze_triangle(*combo)
        test_results.append({
            "边a": combo[0],
            "边b": combo[1],
            "边c": combo[2],
            "预期结果": result,
            **details
        })
    
    # 转换为DataFrame并保存
    df = pd.DataFrame(test_results)
    df.to_excel("三角形测试用例全集.xlsx", index=False)
    return df

def generate_decision_table():
    # 创建完整的决策表
    conditions = [
        {"构成三角形": True, "a==b": True, "b==c": True, "c==a": True},
        {"构成三角形": True, "a==b": True, "b==c": False, "c==a": False},
        {"构成三角形": True, "a==b": False, "b==c": True, "c==a": False},
        {"构成三角形": True, "a==b": False, "b==c": False, "c==a": True},
        {"构成三角形": True, "a==b": False, "b==c": False, "c==a": False},
        {"构成三角形": False, "a==b": None, "b==c": None, "c==a": None}
    ]
    
    decision_table = []
    for cond in conditions:
        if not cond["构成三角形"]:
            decision_table.append({
                **cond,
                "规则描述": "不满足三角形不等式",
                "测试用例示例": "1,2,3",
                "预期输出": "不构成三角形"
            })
        elif all([cond["a==b"], cond["b==c"], cond["c==a"]]):
            decision_table.append({
                **cond,
                "规则描述": "三边相等",
                "测试用例示例": "5,5,5",
                "预期输出": "等边三角形"
            })
        elif sum([cond["a==b"], cond["b==c"], cond["c==a"]]) >= 1:
            desc = []
            if cond["a==b"]: desc.append("a=b")
            if cond["b==c"]: desc.append("b=c")
            if cond["c==a"]: desc.append("c=a")
            decision_table.append({
                **cond,
                "规则描述": "两边相等(" + ",".join(desc) + ")",
                "测试用例示例": "5,5,7" if cond["a==b"] else "5,7,5" if cond["c==a"] else "7,5,5",
                "预期输出": "等腰三角形"
            })
        else:
            decision_table.append({
                **cond,
                "规则描述": "三边均不等",
                "测试用例示例": "3,4,5",
                "预期输出": "普通三角形"
            })
    
    df = pd.DataFrame(decision_table)
    df.to_excel("三角形决策表.xlsx", index=False)
    return df

这段进阶代码提供了两个关键功能:

  1. generate_comprehensive_cases: 生成指定范围内的所有可能边长组合的测试用例
  2. generate_decision_table: 生成完整的决策表文档,包含规则描述和示例

实际应用场景

  • 新员工培训时快速生成标准测试用例集
  • 回归测试时确保覆盖所有边界条件
  • 测试方案评审时提供完整的决策逻辑文档

5. 工具集成与团队协作方案

为了让整个团队都能受益于这些自动化工具,我们可以将其集成到日常工作中。以下是几种实用的集成方案:

方案一:Python脚本作为共享工具

  1. 将脚本保存为triangle_tester.py
  2. 团队共享使用方式:
    python triangle_tester.py --sides 3 4 5  # 单次测试
    python triangle_tester.py --generate-all --min 1 --max 10  # 生成所有组合
    python triangle_tester.py --decision-table  # 生成决策表文档
    

方案二:Excel模板共享

  1. 创建包含所有公式的Excel模板
  2. 设置数据验证确保输入有效性
  3. 添加条件格式使结果更直观:
    • 等边三角形:绿色填充
    • 等腰三角形:黄色填充
    • 普通三角形:蓝色填充
    • 不构成三角形:红色填充

方案三:集成到测试框架

import unittest
from triangle_tester import analyze_triangle

class TestTriangleDecisionTable(unittest.TestCase):
    def test_equilateral(self):
        result, _ = analyze_triangle(5, 5, 5)
        self.assertEqual(result, "等边三角形")
    
    def test_isosceles(self):
        result, _ = analyze_triangle(5, 5, 7)
        self.assertEqual(result, "等腰三角形")
    
    def test_scalene(self):
        result, _ = analyze_triangle(3, 4, 5)
        self.assertEqual(result, "普通三角形")
    
    def test_not_triangle(self):
        result, _ = analyze_triangle(1, 2, 3)
        self.assertEqual(result, "不构成三角形")

if __name__ == "__main__":
    unittest.main()

团队协作最佳实践

  1. 使用版本控制(如Git)管理脚本和测试用例
  2. 定期更新决策表以反映业务规则变化
  3. 在测试文档中引用自动生成的决策表
  4. 为新测试人员提供标准化的测试用例集
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐