当前位置: 首页 > news >正文

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绘制热力图的子图 提示&#xff1a;如何绘制三张子图 绘制的时候&#xff0c;会出现如下问题 &#xff08;1&#xff09;如何绘制1*3的子图 &#xff08;2&#xff09;三个显示条&#xff0c;如何只显示最后一个 提示&#xff1a;下面就展示详细步骤 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 调试部署的时候&#xff0c;我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别&#xff1a; war 模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded 模式&#xff1a;将WEB工程以当前文件夹的位置…...

Delphi IdTcpServer IdTcpClient 传输简单文本

Delphi IdTcpServer IdTcpClient 传输简单文本 已经很久敲代码了&#xff0c;想找一段直接Delphi11 TCP简单文本传输&#xff0c;费劲&#xff01;FStringStream 、FStrStream &#xff1a; FStringStream:TStringStream.Create(,TEncoding.UTF8); 已经很久敲代码了&#xff0c…...

界面控件Telerik UI for WPF——Windows 11主题精简模式提升应用体验

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。Telerik UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的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.如果截图空白&#xff1a; 1.1以下的参数是必须要有的。 width: shareContent.offsetWidth, //设置canvas尺寸与所截图尺寸相同&#xff0c;防止白边height: shareContent.offsetHeight, //防止白边logging: true,useCORS: true,x:0,y:0,2&#xff0c;如果出现了报错 toData…...

Eclipse错误提示: Symbol ‘xxxx‘ could not be resolved

问题现象&#xff1a; 调试FPGA时&#xff0c;如果在qsys中增加新的内容&#xff0c;到nios中编译的时候就会提示找不到宏定义。 而这些宏定义都是在system.h这个头文件中的&#xff0c;原来的宏定义都能找到&#xff0c;就是新增的找不到&#xff0c;这个应该和头文件路径没有…...

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。

基于Java的OA办公管理系统&#xff0c;Spring Boot框架&#xff0c;vue技术&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;完美运行&#xff0c;有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理&#xff1b; 管理员&#xff1a;个人中心、普通员工…...

正则表达式(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 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…...

stable diffusion实践操作-重绘

系列文章目录 本文专门开一节写局部重绘相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、局…...

C# 静态构造函数未执行 .net core框架

代码如下&#xff0c;在执行Encoding.GetEncoding(“gb2312”);方法后报错&#xff0c;说没有找到对应编码&#xff0c;经测试&#xff0c;发现是静态构造函数未执行。 public static class Encodings {/// <summary>/// 注册相关编码/// </summary>static Encodi…...

Java 复习笔记 - 学生管理系统篇

文章目录 学生管理系统一&#xff0c;需求部分需求分析初始菜单学生类添加功能删除功能修改功能查询功能 二&#xff0c;实现部分&#xff08;一&#xff09;初始化主界面&#xff08;二&#xff09;编写学生类&#xff08;三&#xff09;编写添加学生方法&#xff08;四&#…...

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...