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

如何使用unittest和pytest进行python脚本的单元测试

1. 关于unittest和pytest

unittest是python内置的支持单元测试的模块,他提供了核心类,TestCase,让单元测试
代码的编写不再是从0开始,不再是作坊式,而是标准化,模板化,工厂化。
pytest是第三方支持单元测试的扩展库,他和unittest配合,可以使你在为一个新的源码文件编写测试代码时,不用手动定义程序入口,以及要执行哪些表示测试的函数或类。你只需按照一个”套路“写测试代码,它会帮你运行测试,汇总测试结果(覆盖率,通过率等等)

2. 单元测试代码的编写

假设我有一个名为”X.py"的脚本文件,其中定义了一个名为A的类,我想对A中的方法add和mult进行测试:

class A:def fun(a:int,b:int)->int:return a+bdef multi(a:int,b:int)->int:return a*b

则推荐的编写测试A的流程如下:

2.1 新建一个名为test_A.py文件

这个文件用于存放对A这个类进行单元测试的代码。一般来说,建议把你项目中所有测试模块文件都放到项目根目录下的tests目录中,便于维护。

2.2 在test_A.py文件中定义测试类(继承unittest.TestCase)

from unittest import TestCase
class TestA(TestCase):def setUp(self):"""所有以test_开头的方法执行之前都会调用该方法,通常在这个方法中创建一个或若干你要测试的类的实例"""...self.obj_a = A(...)...def test_add(self):result = self.obj_a.add(3,5)self.assertEqual(result,8) #检测结果是否为期望值8,若不是,该测试方法不通过def test_multi(self):result = self.obj_a.multi(4,5)self.assertEqual(result,20) #功能与上类似,TestCase还提供了很多其他以assert为前缀的方法,满足我们将实际运行结果与期望值比较的需求。

2.3 运行测试代码文件,查看测试结果

如果不使用pytest扩展库,你还需要写一段样板代码,类似如下:

def main():...test_a = TestA()test_a.test_add()test_a.test_multi()...

这令人烦恼。好在pytest让你可以省去这个麻烦,只要你安装好了pytest,那么,可以采取两种方法运行测试:
方法1:命令行运行pytest执行单元测试
方法2:在pycharm环境执行单元测试

2.3.1 在命令行下允许pytest单元测试

命令行下,进入tests目录,执行如下命令:
pytest
即可看到所有以test_开头的方法或函数的执行过程及结果。
记住,最好是虚拟环境下安装包括pytest在内的各种扩展库。

2.3.2 在pycharm IDE下运行测试

这个非常方便,打开测试脚本文件,单击下图所示的运行按钮,即可出现测试结果。
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机储存单位换算:1KB等于多少GB
  • MS8561/8562精密、低噪、CMOS、轨到轨输入输出运算放大器
  • AWS 注册一年后是否需要花钱?
  • 贪心算法之重叠区间问题
  • Linux | 深入探究Linux进程控制:从fork到进程等待再到进程替换
  • 使用WINUI3 编写一个小软件1 C#
  • 如何更改select option边框颜色和选中的颜色
  • 鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导
  • 图像处理 -- 仿射变换之Affine Transformation
  • 多个条件同时查询时username和name无法被解析
  • git 配置SSH
  • 计算机网络:DNS、子网掩码、网关
  • 查找技术(4/6 改)
  • 【git】 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  • 低代码与AI:赋能企业数字化转型
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《深入 React 技术栈》
  • Angularjs之国际化
  • ES6 ...操作符
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js 实现textarea输入字数提示
  • JS函数式编程 数组部分风格 ES6版
  • learning koa2.x
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • react-native 安卓真机环境搭建
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vim Clutch | 面向脚踏板编程……
  • vue数据传递--我有特殊的实现技巧
  • 半理解系列--Promise的进化史
  • 关于 Cirru Editor 存储格式
  • 后端_MYSQL
  • 简析gRPC client 连接管理
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 双管齐下,VMware的容器新战略
  • 微信开源mars源码分析1—上层samples分析
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • # .NET Framework中使用命名管道进行进程间通信
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ${factoryList }后面有空格不影响
  • (day6) 319. 灯泡开关
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (算法)前K大的和
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .Net Core 中间件与过滤器
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 调用php,php 调用.net com组件 --
  • .NET 动态调用WebService + WSE + UsernameToken
  • @EventListener注解使用说明
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [383] 赎金信 js
  • [AIGC] MySQL存储引擎详解