前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >白盒测试?看这一篇就够了

白盒测试?看这一篇就够了

作者头像
一个正经的测试
发布2024-01-22 17:03:33
3440
发布2024-01-22 17:03:33
举报

DAY 1

14

2024-01

点击上方蓝字“一个正经的测试“关注我,每周早上08:30准时推送,每月不定期赠送技术书籍

微信公众号后台回复“软件测试基础”、“简历与面试”等领取测试资源,回复“微信交流群”、“内推群”一起进群吹水摸鱼。

本文4099字,阅读约需15分钟

五星上将麦克阿瑟曾经说过“在白盒测试面前,黑盒测试就是一个弟弟”

1

让我们来讲一个故事

今天和女朋友吵架了,(假设你有女朋友)。

今晚又是一个人睡沙发,这天晚上,你躺在沙发上,夜不能寐

决定。痛定思痛

决定分享一下今天的主题——白盒测试

什么是白盒测试?

在深化白盒测试的理解之前,让我们通过一个简单的故事来解释白盒测试的概念。想象一下,你正在修理一台复杂的钟表。白盒测试正如你打开钟表的背盖,查看每一个齿轮的转动,每一个弹簧的走向,确定每一部分都正确地互相作用。现在,让我们更详细地了解白盒测试,并了解它的实施步骤和方法。

白盒测试概述:

  • 白盒测试用例需要做到:大体上,白盒测试用例应确保每一个逻辑路径都被检验,每一个语句和函数都被执行,确保软件的内部结构和功能达到预期。
  • 白盒测试的目的:白盒测试主要目的是提高软件质量,通过检查内部结构和设计,找出可能的逻辑错误和遗漏等,并通过改正这些功能错误和逻辑错误,做到预防软件错误。
  • 白盒测试的特点:白盒测试要求测试人员具有一定的程序设计能力,理解被测程序的内部逻辑结构及其相互关系,是一种结构化的测试方法。这就需要测试人员对软件的实现有深入的理解,包括数据流、控制流、数据结构、程序结构、程序和程序的接口、程序和操作系统及硬件的接口等。

白盒测试的实施步骤:

  1. 理解需求和设计:需要理解软件的需求和设计,以了解软件的预期行为。
  2. 创建详细的测试计划:在软件的设计阶段完成后,对软件进行详细的测试计划,确定测试的工作及其范围。
  3. 设计测试用例:根据软件的内部结构设计测试用例。
  4. 执行测试:通过执行设计的测试用例进行测试,并记录结果。
  5. 分析和报告:分析测试结果并对测试结果进行报告。

  • 白盒测试的方法:总体上分为静态方法和动态方法两大类。静态方法主要通过阅读和审查代码来找出错误,不需要运行系统。动态方法则是通过实际运行系统的方式来进行测试。

2

白盒测试的方法

  • 语句覆盖:保证代码中每一个语句至少执行一次。
  • 判定覆盖:保证代码中的每一个判断(if,while等)的结果至少为真和假各一次。
  • 条件覆盖:保证判定中的每一个条件(一般指"&&"、“||”连接的多个判断中的每一个判断)结果至少为真和假各一次。
  • 判定条件覆盖:满足判定覆盖和条件覆盖。
  • 条件组合覆盖:一个判断中的所有条件的所有组合情况。
  • 路径覆盖:保证代码中的每一个可能路径都至少执行一次。该方法测试的全面性最强,但同时需要的工作量也是最大的,实际中往往因为路径数量过大而无法做到全部覆盖。

下面我们通过具体的代码例子来进行说明

  1. 语句覆盖 - 下面的代码示例展示了如何用语句覆盖测试方法来测试一个简单的Python函数。
代码语言:javascript
复制
def greetings(name):
    return "Hello, " + name
#测试用例:
def test_greetings(): 
    assert greetings("Amy") == "Hello, Amy"
  1. 判定覆盖 - 这种测试方法确保代码中的每一个判断(if,while等)的结果至少为真和假各一次。
代码语言:javascript
复制
def is_even(number):
    if number % 2 == 0:
        return True
    else:
        return False
#测试用例
def test_is_even():
    assert is_even(2) == True
    assert is_even(3) == False
  1. 条件覆盖 - 这种测试方法关注的是判定中的每一个条件至少为真和假各一次。以下是一个简单的if else条件测试案例。
代码语言:javascript
复制
def can_vote(age, citizenship):
    if age >= 18 and citizenship == 'USA':
        return True
    else:
        return False
#测试用例
def test_can_vote():
    assert can_vote(21, 'USA') == True
    assert can_vote(17, 'USA') == False
    assert can_vote(21, 'France') == False
  1. 判定条件覆盖 - 判定覆盖和条件覆盖的结合体,同样使用can_vote的函数来测试。
  2. 条件组合覆盖 - 这种方法关注的是一个判断中的所有条件的所有可能组合情况。以下是一个简单的逻辑操作符测试案例。
代码语言:javascript
复制
def check_numbers(a, b, c):
    if a > b and b > c:
        return 'Descending'
    elif a < b and b < c:
        return 'Ascending'
    else:
        return 'None'
#测试用例
def test_check_numbers():
    assert check_numbers(3, 2, 1) == 'Descending'
    assert check_numbers(1, 2, 3) == 'Ascending'
    assert check_numbers(2, 1, 3) == 'None'
  1. 路径覆盖 - 保证代码中的每一个可能路径都至少执行一次。这个例子将覆盖所有的路径:
代码语言:javascript
复制
def order(a, b, c):
    smallest = min(a, b, c)
    largest = max(a, b, c)
    middle = (a + b + c) - smallest - largest
    return [smallest, middle, largest]
#测试用例
def test_order():
    assert order(1,2,3) == [1, 2, 3]
    assert order(1,3,2) == [1, 2, 3]
    assert order(2,1,3) == [1, 2, 3]
    assert order(2,3,1) == [1, 2, 3]
    assert order(3,2,1) == [1, 2, 3]
    assert order(3,1,2) == [1, 2, 3]

3

我们举一个具体的例子

假设我们有一个函数,它需要处理一个银行账户的交易,如存款,提款和余额查询。我们需要覆盖所有路径以确保每一种操作都被正确执行。

代码语言:javascript
复制
class BankAccount:
    def __init__(self):
        self.balance = 0

    def deposit(self, amount):
        self.balance += amount
        return self.balance

    def withdraw(self, amount):
        if amount > self.balance:
            return 'Insufficient funds'
        self.balance -= amount
        return self.balance

    def get_balance(self):
        return self.balance

为了使用路径覆盖测试,我们可以写如下的测试用例:

代码语言:javascript
复制
def test_bank_account():
    account = BankAccount()
    
    # Test deposit
    assert account.deposit(100) == 100
   
    # Test get balance
    assert account.get_balance() == 100

    # Test withdraw with sufficient funds
    assert account.withdraw(50) == 50
    assert account.withdraw(50) == 0

    # Test withdraw with insufficient funds
    assert account.withdraw(50) == 'Insufficient funds'

    # Check final balance
    assert account.get_balance() == 0
    
    

我们覆盖了所有可能的路径:存款,查询余额,足够的资金提现,资金不足的提现,以及最终的余额查询。这就是路径覆盖测试的实施例子,它可以确保代码在所有可能的路径下都被验证。

以上就是今天的全部内容,希望对大家有所帮助,也希望大家多多留言、点赞、在看、转发四连爱❤️ 支持。 咱们下篇文章见,Bye~👋

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个正经的测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档