python07-单元测试框架unittest1-1

news2024/11/22 21:14:48

前言

        单元测试是软件开发中不可或缺的一部分,可以帮助开发人员确保代码的正确性、可靠性和稳定性,python是一种广泛使用的程序语言,提供了多种单元测试工具,最常用的是unittest。本文将介绍unittest package, 包括如何编写测试TestCase、执行测试、断言以及使用测试套件TestSuite等,还将介绍测试覆盖率的概念,以及如何使用unittest来计算测试覆盖率

unittest

        unittest是python自带的一个单元测试框架,可以帮助开发人员编写和执行单元测试,unittest框架提供了不少概念,包括断言、测试用例和测试套件等。unittest框架的核心是TestCase类,这个类用于定义单元测试,TestCase类中定义了许多测试方法

1 unittest框架最核心的4个概念

  • TestCase:测试用例:一个testcase的实例就是一个测试用例
  • TestSuite:测试套件:多个测试用例集合在一起,TestLoader:是用来加载TestCase到TestSuite中的
  • TextTestRunner:测试运行程序:用来执行测试用例的
  • fixture:测试环境搭建和销毁,测试前准备环境的搭建setUp,执行测试代码run,以及测试后环境的还原tearDown

unittest不仅能做单元测试、集成测试、系统测试,可以做web测试、接口测试、app测试

 导入模块:

import unittest

pycharm设置: 

简单例子

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(0, 0), 0)

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

        在示例中,定义了一个add函数,然后编写了一个测试类TestAdd继承了unittest.TestCase类,并定义了一个测试方法test_add,在这个测试方法中,使用了self.assertEqual断言来比较add函数的输出是否达到预期结果

2 使用unittest.TestCase定义测试项目

        编写测试程序是单元测试中的一个关键步骤,测试程序是指对程序码的一个特定部分进行测试的一个单元,在python中,可以通过继承unittest.TestCase类来定义测试,如下例子:

程序码:检查是否登录成功

def login_check(username = None, password = None):
    if 6 <= len(password):
        if username =='python' and password == '123456':
            return {"code":0, "msg":"登陆成功"}
        else:
            return {"code": 1, "msg": "账户或密码不正确"}
    else:
        return {"code": 1, "msg": "密码长度再6-1位之间"}
  
"""
1、账户、密码正确 ====》 {"code":0, "msg":"登陆成功"}
2、账号正确,密码再6-18之间 ====》  {"code": 1, "msg": "账户或密码不正确"}
3、账号正确,密码长度少于6 ====》 "code": 1, "msg": "密码长度再6-18位之间"
4、账号正确,密码长度对于18 ====》"code": 1, "msg": "密码长度再6-18位之间"
5、错误账号,密码正确  ===》{"code": 1, "msg": "账户或密码不正确"}
.....
"""

简单的范例: 

#第一步建立一个类,一般Test开头代表测试类
#unittest框架自动设置好了实例,不用调实例就可以执行
class TestLogin(unittest.TestCase):
    #测试用例的方法
    def test_login_success(self):
        """登录成功用例"""
        username = 'python'
        password = '123456'
        expected_response = {"code":0, "msg":"登陆成功"}
        #调用被测试的单元,获得实际结果
        actual_response = login_check(username, password)

        #判断预期结果和实际结果是否存在某种关系,断言assert
        #TODO:虽然断言有很多种方法一般使用assertTrue
        #AssertionError
        #self.assertEqual(expected_response,actual_response)
        self.assertTrue(expected_response == actual_response)

    #测试用例2
    def test_login_error(self):
        username = ''
        password = ''
        expected_response = {"code": 1, "msg": "账户或密码不正确"}
        actual_response = login_check(username, password)
        self.assertTrue(expected_response == actual_response)

         在这个示例中,定义一个测试用例TestLogin,并定义了2个测试方法test_login_success、test_login_error,在这些测试方法中,使用断言来检查函数的输出是否符合预期,断言可以确保待测函数在不正确的参数下会引发异常,从而保证待测函数的正确性

3 使用unittest.main()执行测试

        在编写测试程序后,需要执行这些测试项目,并确定待测函数的输出是否符合预期,在python中,可以通过unittest.main()来执行测试

如图例子:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('hello'.upper(), 'HELLO')

    def test_isupper(self):
        self.assertTrue('HELLO'.isupper())
        self.assertFalse('Hello'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # 檢查s.split的結果是否為 ['hello', 'world']

        with self.assertRaises(TypeError):
            s.split(2)
        # 檢查s.split(2)是否會引發TypeError異常

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

    在这个实例中,执行unittest.main(),会自动执行TestStringMethods类中的所有参数方法,如果加入verbosity参数来执行此测试,

if __name__ == '__main__':
    unittest.main(verbosity=2)

unittest会提供详细的报告,报告中包含了每个测试的名称、状态等信息

4 断言 (assert)

        断言是单元测试中的一个重要部分,用于检测待测还能输的输出是否符合预期,在python中,unittest框架提供了很多种断言方法,包括以下几种:

  • assertEqual:检查两个值是否相等,如果不相等,则测试失败。
  • assertNotEqual:检查两个值是否不相等,如果不相等,则测试失败。
  • assertTrue:检查一个值是否为True,如果不是,则测试失败。
  • assertFalse:检查一个值是否为False,如果不是,则测试失败。
  • assertIs:检查两个值是否是同一个对象,如果不是,则测试失败。
  • assertIsNot:检查两个值是否不是同一个对象,如果是,则测试失败。
  • assertIn:检查一个值是否包含在另外一个值中,如果不是,则测试失败。
  • assertNotIn:检查一个值是否不包含在另外一个值中,如果是,则测试失败。
  • assertRaises:检查一个函数是否会引发异常,如果不会,则测试失败。

更多assert用法可以参考:Python unittest Assertions Cheat Sheet - Kapeli

例子:

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertNotEqual(add(0, 1), 0)

    def test_add_negative(self):
        self.assertEqual(add(-1, -2), -3)
        self.assertNotEqual(add(-1, -1), 0)

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

        使用恰当的断言对待测试函数的输出进行验证可以提高测试的精度,从而更好发现和修复程序码中的错误

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

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

相关文章

干货分享|分享一款高效的文件搜索工具 Everything

介绍&#xff1a;Everything软件是一款高效的文件搜索工具&#xff0c;主要用于快速定位计算机中的文件和文件夹。 官网地址&#xff1a;voidtools 下载方法&#xff1a;只需依据电脑配置与个人需求选择合适的版本下载&#xff0c;安装过程中一路默认即可轻松完成设置。 注&…

C语言刷题日记(附详解)(3)

一、选填部分 第一题: 以下的变量定义语句中&#xff0c;合法的是( ) A. byte a 128; B. boolean b null; C. long c 123L; D. float d 0.9239; 思路提示&#xff1a;观察选项时不要马虎&#xff0c;思考一下各种类型变量的取值范围&#xff0c;以及其初始化的形式是…

基于yolov8的课堂行为检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的课堂行为检测系统是现代教育技术的创新应用&#xff0c;该系统利用YOLOv8这一先进的深度学习算法&#xff0c;实现了对学生课堂行为的自动、高效和精准监测。YOLOv8在目标检测领域以其卓越的性能和速度著称&#xff0c;通过对学生上课视频或实时摄像…

深入学习AI大模型服务平台的选型应用相关技术和问诊咨询

AI大模型服务平台的选择和应用涉及到多个技术层面和业务需求的考量。下面我会详细介绍几个关键的技术点和应用场景&#xff0c;帮助您更好地理解和选择AI大模型服务平台。 技术选型 1.1 大模型种类 语言模型&#xff1a;如BERT、GPT-3、文心一言等&#xff0c;适用于自然语言…

自动驾驶---什么是Frenet坐标系?

1 背景 为什么提出Frenet坐标系&#xff1f;Frenet坐标系的提出主要是为了解决自动驾驶系统在路径规划的问题&#xff0c;它基于以下几个原因&#xff1a; 符合人类的驾驶习惯&#xff1a; 人类驾驶员在驾驶过程中&#xff0c;通常不会关心自己距离起点的横向和纵向距离&#x…

C++学习笔记——约瑟夫问题

一、题目描述 二、代码 #include<iostream>using namespace std;int main() {int n;//新建变量n int m;//新建变量m cin >>n;//键盘输入n cin >>m;//键盘输入m int a[n];//初始化数组 for(int i0;i<n;i){a[i] i1;}int* p &a[0];//指针指向数组的第一…

AIGC大师秘籍:六步法打造精准文字提示词

&#x1f31f; 引言&#xff1a; 在AIGC&#xff08;人工智能生成内容&#xff09;的奇幻世界里&#xff0c;编写优质的文字提示词&#xff08;Prompt&#xff09;就像是掌握了一门魔法&#xff0c;能够召唤出高质量的内容。今天&#xff0c;我将向你揭露一个六步法的秘密&…

【LeetCode】918. 环形子数组的最大和

1. 题目 2. 分析 单调队列的经典应用。 3. 代码 class Solution:def maxSubarraySumCircular(self, nums: List[int]) -> int:# 使用单调队列的解法# 转换为求区间长度不超过len(nums)内的最大和k len(nums)nums nums nums# 求出前缀和prefixSum [0] * len(nums) pre…

打印单据时每次都弹出对话框,如何取消对话框,实现快速打印?

打印管家婆单据时&#xff0c;每次都打印单据时都弹出一个打印对话框&#xff0c;可不可以跳过一步&#xff0c;实现快速打印呢&#xff1f;答案是可以的&#xff0c;具体操作步骤如下&#xff1a; 1、随意打开一张单据&#xff0c;点击打印按钮旁边的小三角&#xff0c;在菜单…

二刷代码随想录训练营Day 46|647. 回文子串、516.最长回文子序列、动态规划总结篇

1.回文子串 代码随想录 (programmercarl.com) 视频&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串_哔哩哔哩_bilibili 代码&#xff1a; class Solution { public:int countSubstrings(string s) {vector<vector<bo…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

[数据集][目标检测]课堂行行为检测数据集VOC+YOLO格式4065张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4065 标注数量(xml文件个数)&#xff1a;4065 标注数量(txt文件个数)&#xff1a;4065 标注…

华为云征文|基于Flexus云服务器X实例体验大模型部署体验测评

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 前言部署千问大模型 前言 当下&#xff0c;各种大模型层出不穷&#xff0c;先有openai的chatgpt&#xff0c;后有百度文心一言&#xff0c;再就是国内大模型齐头并进…

Java:Period和During

文章目录 Period常用方法代码 During常用方法代码 Period 用于计算两个LocalDate对象 相差的年数&#xff0c;月数&#xff0c;天数 常用方法 代码 package NewTime;import java.time.LocalDate; import java.time.Period;/*** Author: ggdpzhk* CreateTime: 2024-08-31*/ p…

新的打包工具 Rsbuild 尝鲜:Vue2-cli 项目迁移 Rsbuild

当前时间 2024-08-31 看到一个新的打包工具&#xff0c;于是想试一试&#xff0c;这里是官网 测试 用过 vue-cli 的同志们应该有所感受&#xff0c;启动项目挺慢的&#xff0c;我这个项目不太大&#xff0c;第一次启动是最慢的&#xff0c;之后启动快了一些些&#xff0c;而且…

【大数据算法】时间亚线性算法之:时间亚线性判定算法概述。

时间亚线性判定算法概述 1、引言2、空间亚线性算法2.1 定义2.2 实现方式2.3 应用场景2.3.1 大数据分析2.3.2 流数据处理2.3.3 近似计算2.3.4 稀疏数据操作 2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近看新闻没啊&#xff1f; 小鱼&#xff1a;我天天…

【无人机设计与控制】使用 SimMechanics 在 Simulink 中仿真四旋翼飞行器

摘要 本文介绍了如何在Simulink中使用SimMechanics模块对四旋翼无人机进行仿真。通过构建详细的机械模型&#xff0c;用户可以模拟四旋翼的物理运动和动力学行为。这种仿真方法不仅适用于研究无人机的飞行性能&#xff0c;还可以用于测试控制系统的有效性和稳定性。 理论 Si…

用 CSS 实现太阳系运行效果

介绍实现最终效果结语介绍 在编程的浩瀚宇宙中,我们总是在探索能够以最简洁的方式创造出最酷炫效果的方法。而使用 CSS 制作响应式太阳系,绝对能提升你的编程乐趣。 如何用 CSS 实现这个神奇的太阳系呢?关键在于巧妙运用 CSS 的动画、定位和尺寸属性。通过定义不同的元素来…

【深入理解SpringCloud微服务】深入理解nacos配置中心(一)——宏观理解nacos配置中心原理

【深入理解SpringCloud微服务】深入理解nacos配置中心&#xff08;一&#xff09;——宏观理解nacos配置中心原理 简单介绍原理分析客户端启动服务端启动配置新增或修改客户端监听配置变更并刷新 nacos既是一个注册中心也是一个配置中心&#xff0c;它是二合一的。作为注册中心…

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单&#xff0c;‌你可以按照以下步骤操作&#xff1a;‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中&#xff0c;‌创建ContextMenuStrip控件的实例&#xff0c;‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…