Python 面试:单元测试unit testing 使用pytest
1. 对于函数进行单元测试
calc.py
def add(x, y):"""Add Function"""return x + ydef subtract(x, y):"""Subtract Function"""return x - ydef multiply(x, y):"""Multiply Function"""return x * ydef divide(x, y):"""Divide Function"""if y == 0: raise ValueError('Can not divide by zero!')return x / y
test_calc.py
import unittest
import calcclass TestCalc(unittest.TestCase):def test_add(self):self.assertEqual(calc.add(10, 5), 15)self.assertEqual(calc.add(-1, 1), 0)self.assertEqual(calc.add(-1, -1), -2)def test_subtract(self):self.assertEqual(calc.subtract(10, 5), 5)self.assertEqual(calc.subtract(-1, 1), -2)self.assertEqual(calc.subtract(-1, -1), 0)def test_multiply(self):self.assertEqual(calc.multiply(10, 5), 50)self.assertEqual(calc.multiply(-1, 1), -1)self.assertEqual(calc.multiply(-1, -1), 1)def test_divide(self):self.assertEqual(calc.divide(10, 5), 2)self.assertEqual(calc.divide(-1, 1), -1)self.assertEqual(calc.divide(-1, -1), 1)self.assertRaises(ValueError, calc.divide, 10, 0)if __name__ == '__main__':unittest.main()
2. 对于对象(object)进行单元测试
employee.py
class Employee:"""A sample Employee class"""raise_amt = 1.05def __init__(self, first, last, pay):self.first = firstself.last = lastself.pay = pay@propertydef email(self):return '{}.{}@email.com'.format(self.first, self.last)@propertydef fullname(self):return '{} {}'.format(self.first, self.last)def apply_raise(self):self.pay = int(self.pay * self.raise_amt)
test_employee.py
import unittest
from employee import Employeeclass TestEmployee(unittest.TestCase):@classmethoddef setUpClass(cls):print('setupClass')@classmethoddef tearDownClass(cls):print('teardownClass')def setUp(self):print('setUp')self.emp_1 = Employee('Elon', 'Musk', 50000)self.emp_2 = Employee('Sue', 'Smith', 60000)def tearDown(self):print('tearDown\n')def test_email(self):print('test_email')self.assertEqual(self.emp_1.email, 'Elon.Musk@email.com')self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.email, 'John.Musk@email.com')self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')def test_fullname(self):print('test_fullname')self.assertEqual(self.emp_1.fullname, 'Elon Musk')self.assertEqual(self.emp_2.fullname, 'Sue Smith')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.fullname, 'John Musk')self.assertEqual(self.emp_2.fullname, 'Jane Smith')def test_apply_raise(self):print('test_apply_raise')self.emp_1.apply_raise()self.emp_2.apply_raise()self.assertEqual(self.emp_1.pay, 52500)self.assertEqual(self.emp_2.pay, 63000)if __name__ == '__main__':unittest.main()
输出为:
setupClass
setUp
test_apply_raise
tearDown
.setUp
test_email
tearDown
.setUp
test_fullname
tearDown
.teardownClass
Ran 3 tests in 0.001s
OK
3. 使用mock模拟对象库
employee.py
import requestsclass Employee:"""A sample Employee class"""raise_amt = 1.05def __init__(self, first, last, pay):self.first = firstself.last = lastself.pay = pay@propertydef email(self):return '{}.{}@email.com'.format(self.first, self.last)@propertydef fullname(self):return '{} {}'.format(self.first, self.last)def apply_raise(self):self.pay = int(self.pay * self.raise_amt)def monthly_schedule(self, month):response = requests.get(f'http://company.com/{self.last}/{month}')if response.ok:return response.textelse:return 'Bad Response!'
test_employee.py
import unittest
from unittest.mock import patch
from employee import Employeeclass TestEmployee(unittest.TestCase):@classmethoddef setUpClass(cls):print('setupClass')@classmethoddef tearDownClass(cls):print('teardownClass')def setUp(self):print('setUp')self.emp_1 = Employee('Elon', 'Musk', 50000)self.emp_2 = Employee('Sue', 'Smith', 60000)def tearDown(self):print('tearDown\n')# Test 1def test_email(self):print('test_email')self.assertEqual(self.emp_1.email, 'Elon.Musk@email.com')self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.email, 'John.Musk@email.com')self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')# Test 2def test_fullname(self):print('test_fullname')self.assertEqual(self.emp_1.fullname, 'Elon Musk')self.assertEqual(self.emp_2.fullname, 'Sue Smith')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.fullname, 'John Musk')self.assertEqual(self.emp_2.fullname, 'Jane Smith')# Test 3def test_apply_raise(self):print('test_apply_raise')self.emp_1.apply_raise()self.emp_2.apply_raise()self.assertEqual(self.emp_1.pay, 52500)self.assertEqual(self.emp_2.pay, 63000)# Test 4def test_monthly_schedule(self):# 模拟替换网络请求with patch('employee.requests.get') as mocked_get:mocked_get.return_value.ok = Truemocked_get.return_value.text = 'Success'schedule = self.emp_1.monthly_schedule('May')mocked_get.assert_called_with('http://company.com/Musk/May')self.assertEqual(schedule, 'Success')mocked_get.return_value.ok = Falseschedule = self.emp_2.monthly_schedule('June')mocked_get.assert_called_with('http://company.com/Smith/June')self.assertEqual(schedule, 'Bad Response!')if __name__ == '__main__':unittest.main()
输出为:
setupClass
setUp
test_apply_raise
tearDown
.setUp
test_email
tearDown
.setUp
test_fullname
tearDown
.setUp
tearDown
.teardownClass
Ran 4 tests in 0.001s
OK
4. 使用pytest进行测试
binarysearch.py,主要使用assert。
def binary_search(array, target):if not array:return -1begin, end = 0, len(array)while begin < end:mid = begin + (end - begin) // 2if array[mid] == target:return midelif array[mid] > target:end = midelse:begin = mid + 1return -1def test():assert binary_search([0, 1, 2, 3, 4, 5], 1) == 1assert binary_search([0, 1, 2, 3, 4, 5], 6) == -1assert binary_search([0, 1, 2, 3, 4, 5], -1) == -1assert binary_search([0, 1, 2, 3, 4, 5], 0) == 0assert binary_search([0, 1, 2, 3, 4, 5], 5) == 5assert binary_search([0], 0) == 0assert binary_search([], 1) == -1
在CMD中输入指令:pytest binarysearch.py
输出为:
================================================= test session starts =================================================
platform win32 – Python 3.10.9, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\h13je\Working_Log\01092023\python_learning
plugins: anyio-3.5.0
collected 1 item
binarysearch.py . [100%]
================================================== 1 passed in 0.02s ==================================================
相关文章:
Python 面试:单元测试unit testing 使用pytest
1. 对于函数进行单元测试 calc.py def add(x, y):"""Add Function"""return x ydef subtract(x, y):"""Subtract Function"""return x - ydef multiply(x, y):"""Multiply Function""…...
螺旋矩阵、旋转矩阵、矩阵Z字打印
螺旋矩阵 #include <iostream> #include <vector> void display(std::vector<std::vector<int>>&nums){for(int i 0; i < nums.size(); i){for(int j 0; j < nums[0].size(); j){std::cout<<nums[i][j]<< ;}std::cout<<…...
Seaborn绘制热力图的子图
Seaborn绘制热力图的子图 提示:如何绘制三张子图 绘制的时候,会出现如下问题 (1)如何绘制1*3的子图 (2)三个显示条,如何只显示最后一个 提示:下面就展示详细步骤 Seaborn绘制热力…...
C++二级题目4
小白鼠再排队 不会 多余的数 #include<iostream> #include<string.h> #include<stdio.h> #include<iomanip> #include<cmath> #include<bits/stdc.h> int a[2000][2000]; int b[2000]; char c[2000]; long long n; using namespace std; i…...
Tomcat 部署时 war 和 war exploded区别
在 Tomcat 调试部署的时候,我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别: war 模式:将WEB工程以包的形式上传到服务器 ;war exploded 模式:将WEB工程以当前文件夹的位置…...
Delphi IdTcpServer IdTcpClient 传输简单文本
Delphi IdTcpServer IdTcpClient 传输简单文本 已经很久敲代码了,想找一段直接Delphi11 TCP简单文本传输,费劲!FStringStream 、FStrStream : FStringStream:TStringStream.Create(,TEncoding.UTF8); 已经很久敲代码了,…...
界面控件Telerik UI for WPF——Windows 11主题精简模式提升应用体验
Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。Telerik UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visua…...
PoseC3D 基于人体姿态的动作识别新范式
摘要1. Introduction2. Related Work动作识别 3D-CNN基于骨架的动作识别 GCN基于骨骼的动作识别 2D-CNN3. Framework3.1. Good Practice for Pose Extraction3.2. From 2D Poses to 3D Heatmap Volumes3.3 基于骨骼的动作识别 3D-CNNPose-SlowOnlyRGBPose-SlowFast4. Experimen…...
html2canvas 截图空白 或出现toDataURL‘ on ‘HTMLCanvasElement或img标签没截下来 的所有解决办法
1.如果截图空白: 1.1以下的参数是必须要有的。 width: shareContent.offsetWidth, //设置canvas尺寸与所截图尺寸相同,防止白边height: shareContent.offsetHeight, //防止白边logging: true,useCORS: true,x:0,y:0,2,如果出现了报错 toData…...
Eclipse错误提示: Symbol ‘xxxx‘ could not be resolved
问题现象: 调试FPGA时,如果在qsys中增加新的内容,到nios中编译的时候就会提示找不到宏定义。 而这些宏定义都是在system.h这个头文件中的,原来的宏定义都能找到,就是新增的找不到,这个应该和头文件路径没有…...
基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。
基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台后台,完美运行,有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理; 管理员:个人中心、普通员工…...
正则表达式(JAVA)
正则表达式(JAVA) 文章目录 正则表达式(JAVA)用法字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词贪婪爬取符号捕获分组规则捕获分组符号 非捕获分组案例忽略大小写 用法 正则表达式在用于校验信息是否满足某些规则的时候,非常的好用 在文本中查找满足要求的内容 字…...
264_BOOST中的Json库解析_BOOST_AUTO(itrpromodel, doc.FindMember(“productmodel“));
BOOST_AUTO(itrpromodel, doc.FindMember("productmodel"));if(itrpromodel != doc.MemberEnd()){BOOST_AUTO(iterd_url...
linux rpm 离线安装 nginx 自用,仅供参考
检查是否安装nginx ps -ef|grep nginx 检查rpm是否安装nginx rpm -qa|grep nginx 查看linux centos 发行版本 cat /etc/centos-release (查看其它发现版本 就把centos替换为别的 比如 红旗的 redflag ) 查看cpu信息 x86_64 lscpu 检查nginx所需依赖 …...
第十二章 YOLO的部署实战篇(上篇)
cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...
无涯教程-Android - List View函数
Android ListView 是垂直滚动列表中显示的视图,使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁,适配器保存数据并将数据发送到适配器视图࿰…...
stable diffusion实践操作-重绘
系列文章目录 本文专门开一节写局部重绘相关的内容,在看之前,可以同步关注: stable diffusion实践操作 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、局…...
C# 静态构造函数未执行 .net core框架
代码如下,在执行Encoding.GetEncoding(“gb2312”);方法后报错,说没有找到对应编码,经测试,发现是静态构造函数未执行。 public static class Encodings {/// <summary>/// 注册相关编码/// </summary>static Encodi…...
Java 复习笔记 - 学生管理系统篇
文章目录 学生管理系统一,需求部分需求分析初始菜单学生类添加功能删除功能修改功能查询功能 二,实现部分(一)初始化主界面(二)编写学生类(三)编写添加学生方法(四&#…...
【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】
一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
