Python assert实现软件测试

news2024/12/27 13:58:44
  • P y t h o n Python Python 对于测试非常看重,例如测试中最常见的操作——断言 a s s e r t assert assert,其在 P y t h o n Python Python 中就是一个关键字而不是一个函数。而在 C C C 语言中, a s s e r t assert assert 只是一个普通的函数。从这点也可以看出, P y t h o n Python Python 将测试当作最基础的部分。
  • 需要注意的是,默认情况下, P y t h o n Python Python 解释器在运行时会忽略所有的 a s s e r t assert assert 语句,因此在发布版本中, a s s e r t assert assert 语句通常应该被禁用。可以通过使用 -O(大写字母 O)命令行选项来启用断言检查,例如 python -O myscript.py,这样在运行时 a s s e r t assert assert 语句将会生效。
  • P y t h o n Python Python 中, a s s e r t assert assert 关键字用于编写断言语句,用于在代码中检查某个条件是否为真,如果条件不满足,则会引发 A s s e r t i o n E r r o r AssertionError AssertionError 异常。其基本语法如下:
assert condition [,message]
其中 $'condition'$ 是需要检查的条件表达式语句,如果结果为 $'False'$ ,则会触发 $'AssertionError'$异常;$message$ 是一个可选的字符串,用于在抛出异常时提供错误消息,可以帮助调试和定位错误。

以下是一个简单的示例,展示了如何在 P y t h o n Python Python 中使用 a s s e r t assert assert 关键字:

def divide(a, b):
    assert b != 0, "除数不能为0"
    return a / b

result = divide(10, 5)
print(result)  # 输出:2.0

result = divide(10, 0)  # 触发 AssertionError,错误消息为 "除数不能为0"

== 1. 可以直接是使用 assert 在源代码中对其进行测试,常用的做法如图 1 所示。==
其中在这段代码中,if name == “main”: 是一个常见的 Python 编程惯用语法,用于判断当前模块是否作为独立的主程序执行,而不是作为模块被导入到其他模块中。如果当前模块作为独立的主程序执行,则会执行 if 语句块中的代码。
在这里插入图片描述
下面看一个简单的例子,假定自定义了一个模块 sampleAssert,其代码如下:

def int_list_sort(input_list):
	input_list.sort()
if __name__ == ""__mian__":
	def test_normal_positive_input():
		input_list = [3, 5, 9, 1, 8]
		int_list_sort(input_list)
		assert input_list == [1, 3, 5, 8, 9]
		print("test_normal_positive_input: PASS")
	test_normal_positive_input()

如果是直接运行该脚本,则测试用例就会被触发。

(venv) chen@deMacBook-Air pythonProject % python test.py test_normal_positive_input: PASS

如果我们是 import(引入)该模块,case 是不会执行的,即第 3 行开始的块是不会执行的,所以包含在该块内的测试用例定义不会被看到,测试用例也不会被执行。

>>> import test                          # 引入模块
>>> test.test_normal_positive_input()    # 执行测试函数
Traceback (most recent call last):       # 测试函数不可见
  File "<stdin>", line 1, in <module>
AttributeError: module 'test' has no attribute 'test_normal_positive_input' 

但是被测函数是可见的

>>> input_list = [3, 5, 9, 1, 8]
>>> test.int_list_sort(input_list)
>>> input_list
[1, 3, 5, 8, 9]

== 2. 不在源代码中进行测试,在单独的文件中写测试用例代码==

被测代码
在这里插入图片描述

def bubble_sort(input_list):          # 被测对象,完成对输入的整数列表排序
    if type(input_list) is not type([]):
        print("Invalid Input!")
        return None
    for x in input_list:
        if type(x) != int:
            print("Invalid Input!")
            return None
    input_len = len(input_list)
    if len(input_list) <= 1:
        return input_list
    for i in range(input_len-1):
        for j in range(input_len-i-1):
            if input_list[j] > input_list[j+1]:
                input_list[j], input_list[j+1] = input_list[j+1], input_list[j]
    return input_list

测试用例
在功能测试中,测试代码的长度比被测代码的长度还要长,这是软件测试中,尤其是功能测试部分常见的现象。另外一个现象是对于针对特殊使用场景的测试用例数量比较大。多数情况下,问题不会隐藏在常用的使用场景,而多隐藏在这些不常见的使用场景中,所以针对这些特殊使用场景的测试用例的设计需要多下功夫。

import random

from Test import bubble_sort

# 输入的列表为空
def test_empty_input():
    input_list = []
    output = bubble_sort(input_list)
    assert type(output) == type([])
    assert len(output) == 0, "输入为空的列表,输出也是空"

# 输入的不是列表
def test_invalid_input():
    input_list = 1
    output = bubble_sort(input_list)
    assert output is None

def test_invalid_element():
    input_list = ['name']
    output = bubble_sort(input_list)
    assert output is None

# 输入的列表数只有一个
def test_one_input():
    input_list = [1]
    output = bubble_sort(input_list)
    assert output == input_list
    assert len(output) == 1
    print("4.test_one_input: PASS")

# 输入的列表数为两个
def test_two_input():
    input_list = [8, 1]
    output = bubble_sort(input_list)
    assert output == [1, 8]
    assert len(output) == 2
    print("5.test_two_input: PASS")

# 列表包含非整数的元素
def test_invalid_elements():
    input_list = [8, 1, 'name']
    output = bubble_sort(input_list)
    assert output is None

# 正常输入
def test_normal_pos():
    input = [88, 1, 20, 8, 9, 21, 98, 76]
    output = bubble_sort(input)
    expected_output = [1, 8, 9, 20, 21, 76, 88, 98]
    assert output == expected_output
    print("7.test_normal_pos: PASS")

# 输入重复的数字
def test_dup_elements():
    input = [88, 1, 20, 8, 9, 21, 98, 8, 76]        # 两个8
    output = bubble_sort(input)
    expected_output = [1, 8, 8, 9, 20, 21, 76, 88, 98]
    assert output == expected_output
    print("8.test_dup_elements: PASS")

# 输入都是相同的数字
def test_all_same():
    input = [8, 8, 8, 8, 8, 8, 8]
    output = bubble_sort(input)
    expected_output = [8, 8, 8, 8, 8, 8, 8]
    assert output == expected_output
    print("9.test_all_same: PASS")

# 随机生成测试数据
def test_random_input():
    length = random.randint(10, 100)
    random_list = []
    for i in range(length):
        random_list.append(random.randint(-100, 100))

    org_list = random_list
    print(org_list)
    output_list = bubble_sort(random_list)
    print((output_list))
    assert len(output_list) == len(org_list), '排序前后元素数量相等'

    for j in range(length):
        val = output_list[j]
        assert val in org_list, '元素应该和原有列表中的一样'
        assert output_list.count(val) == org_list.count(val), '每个元素出现的次数应该和原有列表相等'
    for j in range(length-1):
        assert output_list[j] <= output_list[j+1], '从小到大排序'
    print("10.test_random_input: PASS")

# 随机进行100轮测试
def test_random_100():
    for i in range(100):
        test_random_input()
    print("11.test_random_100: PASS")
test_empty_input()
test_invalid_input()
test_invalid_element()
test_invalid_elements()
test_one_input()
test_two_input()
test_normal_pos()
test_dup_elements()
test_all_same()
test_random_input()
test_random_100()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP套接字编程

文章目录前言一、TCP套接字1.简单认识TCP协议2.listen函数3.accept函数4.通用TCP服务器二、大小写转换服务1.服务端2.客户端三、多进程版本TCP服务器四、多线程版本TCP服务器前言 这篇文章是紧接着上一篇《UDP套接字编程》文章的&#xff0c;里面详细介绍了套接字编程的一些基…

在Vue项目中使用tinymce富文本编辑器

TinyMC编辑器简介 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。跟其他富文本编辑器相比&#xff0c;有着丰富的插件&#xff0c;支持多种语言&#xff0c;能够满足日常的业务需求并且免费。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插…

虚拟机安装 Ubuntu 桌面版

目录 1、下载系统镜像 2、新建虚拟机 3、配置虚拟机 1、下载系统镜像 Ubuntu桌面版最新版本下载地址&#xff1a;Download | Ubuntu 桌面版 Ubuntu桌面版历史版本下载地址&#xff1a;Download | Ubuntu 桌面版&#xff08;历史版本&#xff09; 以下载18.04 版本为例&am…

【三位重建】NeRF原理+代码讲解

文章目录一、技术原理1.概览2.基于神经辐射场&#xff08;Neural Radiance Field&#xff09;的体素渲染算法3.体素渲染算法4.位置信息编码&#xff08;Positional encoding&#xff09;5.多层级体素采样二、代码讲解1.数据读入2.创建nerf1.计算焦距focal与其他设置2.get_embed…

CSS学习|这一篇就够了|笔记|总结|(超详细讲解)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

误删除文件怎么找回 数据恢复用这些方法

误删除文件是很多人都会遇到的问题&#xff0c;尤其是在Windows 10系统中&#xff0c;有时候我们不小心按了ShiftDelete或者清空了回收站&#xff0c;就会导致文件永久消失。那么&#xff0c;误删除文件怎么找回呢?本文将介绍四种数据恢复的方法&#xff0c;帮助你轻松将误删除…

【PCIE体系结构五】PCIE配置和地址空间

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a; PCI_Express体系结构导读、 深入浅出SSD&#xff1a;固态存储…

【Java版oj】day30最难的问题、因子个数

目录 一、最难的问题 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、因子个数 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 三、DFS深度优…

Python实现批量图片下载及去重处理

背景 在爬虫应用开发中&#xff0c;常常需要批量下载图片&#xff0c;并对图片进行去重处理。Python 是一种非常流行的编程语言&#xff0c;也是开发爬虫应用的首选&#xff0c;本文将介绍如何使用 Python 下载图片&#xff0c;并对下载的图片进行去重处理。 内容 首先&…

win10彻底永久关闭自动更新【亲测有效】

一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;打开运行对话框&#xff0c;然后输入命令 services.msc &#xff0c;点击下方的“确定”打开服务&#xff0c;如下图所示。 2、找到 Windows Update 这一项&#xff0c;并双击打开&#xff0c;如图所示。 3、右击…

【行为型模式】责任链模式

文章目录1、简介2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现4、责任链优缺点5、应用场景1、简介 责任链模式(Chain of Responsibility)是一种行为型设计模式&#xff0c;它允许对象在链上依次处理请求&#xff0c;用户只需要将请求发送到责任链上即可&#xf…

CocosCreator实战篇 | 实现刮刮卡和橡皮擦 | 擦除效果

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/dxt19980308 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649; &#x1f4e2;生活依旧是美好而…

【SSM框架】spring的创建与使用

spring的创建与使用Spring项目的创建创建一个maven项目添加Spring依赖添加启动类将bean存储到Spring 中创建bean对象将bean对象存储到Spring容器中从Spring中获取bean创建Spring(上下文)对象从Spring中获取到bean对象使用Bean&#xff08;非必须&#xff09;从spring中获取Bean…

奇瑞版Model 3与Model Y登场:正式进军高端纯电

作者 | Amy 编辑 | 德新4月7日&#xff0c;奇瑞在北京举办「新能源之夜」。整场发布会都在传递一个讯息&#xff1a;奇瑞搞新能源&#xff0c;要大搞特搞&#xff01; 奇瑞在这场发布会上&#xff0c;对新能源的战略、技术、品牌和产品作了全面梳理。其中最引人注目的是&#x…

环信web、uniapp、微信小程序sdk报错详解---注册篇(二、三)

项目场景&#xff1a; 记录对接环信sdk时遇到的一系列问题&#xff0c;总结一下避免大家再次踩坑。这里主要针对于web、uniapp、微信小程序在对接环信sdk时遇到的问题。 注册篇(二) 注册用户报错400 原因分析&#xff1a; 从console控制台输出及network请求返回入手分析 可以看…

【三十天精通Vue 3】第十一天 Vue 3 过渡和动画详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 过度和动画概述1.1过度和动画的简介二、Vue 3 过度2…

Java 集合框架面试问题集锦

Java集合框架&#xff08;例如基本的数据结构&#xff09;里包含了最常见的Java常见面试问题。很好地理解集合框架&#xff0c;可以帮助你理解和利用Java的一些高级特性。下面是面试Java核心技术的一些很实用的问题。 Q&#xff1a;最常见的数据结构有哪些&#xff0c;在哪些场…

telnet远程管理linux主机及Zlib、openssl、openssh升级

目录 一、telnet远程管理主机 1、检查是否安装telnet 2、安装telnet服务 3、测试telnet登录 二、zlib、openssl、openssh升级 1、下载zlib包 2、下载openssl包 3、下载openssh包 4、 编译安装zlib 5、编译安装openssl 6、准备升级openssh环境 ①注意必须使用telne…

LLM 快人一步的秘籍 —— Zilliz Cloud,热门功能详解来啦!

最近&#xff0c;我们发布了可处理十亿级向量数据的 Zilliz Cloud GA 版本&#xff0c;为用户提供开箱即用的向量数据库服务&#xff0c;大大降低了数据库的运维成本。 看过上一篇文章《可处理十亿级向量数据&#xff01;Zilliz Cloud GA 版本正式发布》的朋友们知道&#xff0…

【SSM】Spring6(十.面向切面编程AOP)

文章目录1.AOP2. AOP的七大术语3. 切点表达式4.使用Spring的AOP4.1 环境准备4.2 基于AspectJ的AOP注解式开发步骤4.3 所有通知类型4.4 切面顺序4.5 通用切点4.6 获取目标方法的方法签名4.7 全注解式开发4.8 基于XML配置的AOP5. 案例&#xff1a;事务处理1.AOP 将与核心业务无关…