python单元测试&白盒测试 - 从简单的函数着手单元测试

前言:
单元测试是保证程序质量的基石,也是考验编程功底的第一道关卡!
编写和执行单元测试,是为了证明目标代码的行为和我们期望的一致,更是为了给上级模块提供良好稳定的执行环境;

 

 

1. 观察目标函数全部的逻辑分支,针对它们设计用例:

      项目需求为“判断是否为超人”,下面我基于Python3,用判定覆盖法来设计参数对其进行单元测试:

 

# coding = utf-8

import pytest

"""第一步:根据传入的参数判断目标是否为超人(Superman)"""


def is_superman(skill, hand):
    # 是否拥有飞行能力?
    can_fly = skill

    # 是否有10个手指?
    have_ten_fingers = hand

    if not can_fly:
        return False
    if not have_ten_fingers:
        return False

    # 返回 True,表示检查的目标是一个真正的"超人"
    return True

2. 对is_superman函数设计一个“逻辑分支”表,可以看到共有3步(有几列就有几步),所以我们至少需要设计3组用例:

 

**注意:下面表格中的 0 表示 False,1 表示 True**

分支 & 步123
if01-
if-01
return--1

 

3. 遍历目标函数的全部路径的思路:

    接下来对这个目标函数设计一个测试器,用3组条件覆盖测试

      基于 Python3 的代码举例——测试函数

"""第二步:准备3组参数,逐个传入目标函数并验证其结果"""


def test_person():
    """由于在python里 0==False,1==True ,所以你可以这样设计3组简单的测试用例:"""
    test_cases = [
        [0, 0],
        [1, 0],
        [1, 1]
    ]

    """根据上面3组用例,设计你的预期结果"""
    expected_results = [False, False, True]

    """for循环帮你覆盖全部用例"""
    for i in range(len(test_cases)):
        assert is_superman(test_cases[i][0], test_cases[i][1]) == expected_results[i]


if __name__ == '__main__':
    pytest.main()

4. 运行脚本,查看测试结果:

============================= test session starts ==============================
platform darwin -- Python 3.6.8, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/terry/PycharmProjects/SuperMancollected 1 item

test_func_unittest.py .                                                  [100%]

=========================== 1 passed in 0.01 seconds ===========================

Process finished with exit code 0

5. 尝试增加一条用例,然后运行脚本,查看新的测试结果:

def test_person():
    
    test_cases = [
        [0, 0],
        [1, 0],
        [1, 1],
        [0, 1], # <--增加1条用例
    ]

    expected_results = [False, False, True, True]  # <--对应增加一个预期结果
============================= test session starts ==============================
platform darwin -- Python 3.6.8, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/terry/PycharmProjects/SuperMancollected 1 item

test_func_unittest.py F
test_func_unittest.py:26 (test_person)
False != True

Expected :True
Actual   :False
<Click to see difference>

def test_person():
        """由于在python里 0==False,1==True ,所以你可以这样设计3组简单的测试用例:"""
        test_cases = [
            [0, 0],
            [1, 0],
            [1, 1],
            [0, 1],
        ]
    
        """根据上面3组用例,设计你的预期结果"""
        expected_results = [False, False, True, True]
    
        """for循环帮你覆盖全部用例"""
        for i in range(len(test_cases)):
>           assert is_superman(test_cases[i][0], test_cases[i][1]) == expected_results[i]
E           assert False == True
E            +  where False = is_superman(0, 1)

test_func_unittest.py:41: AssertionError
                                                  [100%]

=================================== FAILURES ===================================
_________________________________ test_person __________________________________

    def test_person():
        """由于在python里 0==False,1==True ,所以你可以这样设计3组简单的测试用例:"""
        test_cases = [
            [0, 0],
            [1, 0],
            [1, 1],
            [0, 1],
        ]
    
        """根据上面3组用例,设计你的预期结果"""
        expected_results = [False, False, True, True]
    
        """for循环帮你覆盖全部用例"""
        for i in range(len(test_cases)):
>           assert is_superman(test_cases[i][0], test_cases[i][1]) == expected_results[i]
E           assert False == True
E            +  where False = is_superman(0, 1)

test_func_unittest.py:41: AssertionError
=========================== 1 failed in 0.04 seconds ===========================

Process finished with exit code 0

 

### 黑盒测试与白盒测试的概念及区别 #### 定义 黑盒测试是一种基于功能需求的测试方法,它关注的是输入数据和输出结果之间的关系,而不涉及程序内部结构或逻辑。这种方法假设测试人员不了解系统的具体实现细节[^1]。 相比之下,白盒测试则侧重于程序的内部逻辑和代码路径。在这种测试方式下,测试人员需要深入了解软件的具体实现过程以及源代码中的控制流和数据流[^2]。 --- #### 主要区别 ##### 测试视角 黑盒测试从外部用户的视角出发,仅依据规格说明书验证系统是否满足预期的功能行为。而白盒测试则是站在开发者的立场上,深入分析并检测代码的质量、效率和安全性等问题[^3]。 ##### 对象层次 - **黑盒测试**适用于各个层面的应用程序测试,包括单元测试到验收测试阶段都可以采用此法来评估产品性能。 - **白盒测试**更多用于较低级别的组件级或者模块级别上的细粒度检验工作,因为这更便于观察执行流程图中每条分支语句的实际运行情况. ##### 所需技能 由于两者侧重点不同,因此所需具备的知识背景也有所差异: - 进行有效的黑箱试验通常只需要熟悉业务领域知识即可完成; - 而实施成功的白色盒子方案则往往要求参与者具有扎实的技术功底(如精通编程语言语法),以便能够准确解读复杂算法背后的运作机制. ##### 工具支持 针对上述两类活动分别有专门设计好的自动化辅助工具可供选用: - 常见的一些GUI界面操作模拟器可以很好地服务于前者的需求; - 后者可能需要用到静态代码分析仪或者是动态跟踪调试平台等更为专业的解决方案. --- #### 应用场景 | 场景描述 | 更适合的方法 | |----------|--------------| | 当前目标主要是确认最终交付成果能否达到客户提出的各项功能性指标时 | 黑盒测试 | | 需要在编码完成后立即着手排查潜在缺陷以减少后期修复成本的情况下 | 白盒测试 | 例如,在新上线电子商务网站之前进行全面的功能性审查就非常适合运用黑盒手段;而对于那些嵌入式设备驱动层面上的小型固件项目而言,则更适合通过编写针对性强的压力测验脚本来发现隐藏较深的问题所在^. ```python # 示例:简单的黑盒测试函数 def test_login_functionality(): username = &quot;test_user&quot; password = &quot;password123&quot; result = login(username, password) assert result == True, &quot;Login failed with correct credentials.&quot; # 示例:基本的白盒测试片段 (伪代码) for i in range(len(code_paths)): execute_path(i) check_coverage() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木法星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值