练习unittest+Fixture实现

练习01

  1. 创建⼀个⽬录 case, 作⽤就是⽤来存放⽤例脚本,
  2. 在这个⽬录中创建 5 个⽤例代码⽂件 , test_case1.py
  3. 使⽤ TestLoader 去执⾏⽤例
    将来的代码 ⽤例都是单独的⽬录中存放的
    test_项⽬_模块_功能.py

在这里插入图片描述

test_case1.py

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法1')

test_case2.py

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法2')

test_case3.py

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法3')

test_case4.py

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法4')

test_case5.py

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法5')

hm_05_test.py

# 1. 导包 unittest
import unittest
# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestLoader().discover('case', 'test*.py')
# 3.实例化执行对象并执行
unittest.TextTestRunner().run(suite)

TestLoader()
链接: http://t.csdnimg.cn/lLkts

练习02

  1. 定义⼀个 tools 模块, 在这个模块中 定义 add 的⽅法,可
    以对两个数字求和,返回求和结果

  2. 书写⽤例, 对 add() 函数进⾏测试 1, 1, 2 1, 2, 3 3, 4, 7 4, 5, 9
    之前的测试⽅法,直接⼀个 print 这个案例中的 测试⽅法,调⽤ add 函数, 使⽤ if 判断,来判断 预期结果和实际结果是否相符 预期结果 2 3 7 9 实际结果 调⽤ add()

在这里插入图片描述

hm_06_test_add.py

# 1. 导包 unittest
import unittestfrom tools import add# 2. 定义测试类, 只要继承 unittest.TestCase 类
class TestAdd(unittest.TestCase):#3.书写测试方法def test_1(self):"""1,1,2"""if 2 == add(1, 1):print(f'用例 {1}, {1}, {2}通过')else:print(f'用例 {1}, {1}, {2}不通过')def test_2(self):if 3 == add(1, 2):print(f'用例 {1}, {2}, {3}通过')else:print(f'用例 {1}, {2}, {3}不通过')def test_3(self):if 7 == add(3, 4):print(f'用例 {3}, {4}, {7}通过')else:print(f'用例 {3}, {4}, {7}不通过')def test_4(self):if 9 == add(4, 5):print(f'用例 {4}, {5}, {9}通过')else:print(f'用例 {4}, {5}, {9}不通过')

hm_07_add.py

# 套件和执行
# 1. 导包 unittest
import unittestfrom hm_06_test_add import TestAdd
# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestSuite()
# 将 TestAdd 类中的所有测试方法添加到测试套件中
suite.addTest(unittest.makeSuite(TestAdd))
# 使用 TextTestRunner 运行测试套件中的所有测试用例,并将结果输出到标准输出(控制台)
unittest.TextTestRunner().run(suite)

当我们分解这行代码时,我们可以看到它包含了几个关键部分:

  1. unittest.makeSuite(TestAdd): 这部分调用了 unittest 模块中的 makeSuite 函数,它的作用是创建一个测试套件(TestSuite)。makeSuite 函数接受一个测试类作为参数,并自动收集该类中所有以 test 开头的测试方法,并将它们添加到测试套件中。

  2. TestAdd: 这部分是一个测试类的名称,表示我们要将哪个测试类中的测试方法添加到测试套件中。在这个例子中,TestAdd 是一个自定义的测试类。

  3. suite.addTest(...): 这部分是将测试用例(test case)添加到测试套件中的方法。addTest 方法接受一个测试用例对象作为参数,并将其添加到测试套件中。在这个例子中,makeSuite(TestAdd) 返回了一个包含 TestAdd 类中所有测试方法的测试套件,然后我们通过 addTest 方法将这个测试套件添加到另一个测试套件中。

综上所述,suite.addTest(unittest.makeSuite(TestAdd)) 这行代码的作用是将 TestAdd 类中的所有测试方法添加到一个测试套件中。

htools.py

#函数的调用
def add(a, b):return a + b

Fixture

⽅法级别 Fixture

在每个⽤例执⾏前后都会⾃动调⽤, ⽅法名是固定的

def setUp(self): # 前置# 每个⽤例执⾏之前都会⾃动调⽤pass
def tearDown(self): # 后置# 每个⽤例执⾏之后 都会⾃动调⽤pass
# ⽅法前置 ⽤例 ⽅法后置
# ⽅法前置 ⽤例 ⽅法后置

类级别 Fixture

在类中所有的测试⽅法执⾏前后 会⾃动执⾏的代码, 只执⾏⼀次

# 类级别的 Fixture 需要写作类⽅法
@classmethod
def setUpClass(cls): # 类前置pass
@classmethod
def tearDownClass(cls): # 后置pass

模块级别Fixture(了解)

模块, 就是代码⽂件
模块级别 在这个代码⽂件执⾏前后执⾏⼀次

# 在类外部定义函数
def setUpModule():pass
def tearDownModule():pass

Fixture实现

tpshop 登录

  1. 打开浏览器 (⼀次)
  2. 打开⽹⻚,点击登录 (每次)
  3. 输⼊⽤户名密码验证码1,点击登录 (每次, 测试⽅法)
  4. 关闭⻚⾯ (每次)
  5. 打开⽹⻚,点击登录 (每次)
  6. 输⼊⽤户名密码验证码2,点击登录 (每次, 测试⽅法)
  7. 关闭⻚⾯ (每次)
  8. 打开⽹⻚,点击登录 (每次)
  9. 输⼊⽤户名密码验证码3,点击登录 (每次, 测试⽅法)
  10. 关闭⻚⾯ (每次)
  11. 关闭浏览器 (⼀次)

在这里插入图片描述

import unittest
class TestLogin(unittest.TestCase):def setUp(self) -> None:print('2. 打开⽹⻚, 点击登录')def tearDown(self) -> None:print('4. 关闭⽹⻚')@classmethoddef setUpClass(cls) -> None:print('1. 打开浏览器')@classmethoddef tearDownClass(cls) -> None:print('5. 关闭浏览器')def test_1(self):print('3. 输⼊⽤户名密码验证码1,点击登录 ')def test_2(self):print('3. 输⼊⽤户名密码验证码2,点击登录 ')def test_3(self):print('3. 输⼊⽤户名密码验证码3,点击登录 ')

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

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

相关文章

面试经典150题(114-118)

leetcode 150道题 计划花两个月时候刷完之未完成后转,今天完成了5道(114-118)150 gap 了一周,以后就不记录时间了。。 114.(70. 爬楼梯) 题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…

旅行社旅游线路预定管理系统asp.net

旅行社旅游线路预定管理系统 首页 国内游 境外游 旅游景点 新闻资讯 酒店信息―留言板 后台管理 后台管理导航菜单系统管理修改密码留言管理注册会员管理基础数据设置国别设置有份设地区设置 旅行社管理友情链接管理添加友情链接友情链接管理新闻资讯管理添加新闻资讯新闻资讯管…

LayerNormalization 和 RMSNormalization的计算方法和区别

目录 问题来源 Layer Normalization 与 RMSNormalization 的详细计算方法 Layer Normalization(层归一化) RMSNormalization(均方根归一化) Layer Normalization与RMSNormalization的异同 Layer Normalization RMSNormaliza…

24 OpenCV直方图反向投影

文章目录 参考反向投影作用calceackProject 反向投影mixchannels 通道图像分割示例 参考 直方图反向投影 反向投影 反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型 作用…

基于时空上下文(STC)的运动目标跟踪算法,Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

Midjourney 和 Dall-E 的优劣势比较

Midjourney 和 Dall-E 的优劣势比较 Midjourney 和 Dall-E 都是强大的 AI 绘画工具,可以根据文本描述生成图像。 它们都使用深度学习模型来理解文本并将其转换为图像。 但是,它们在功能、可用性和成本方面存在一些差异。 Midjourney 优势: 可以生成更…

js判断对象是否有某个属性

前端判断后端接口是否返回某个字段的时候 <script>var obj { name: "John", age: 30 };console.log(obj.hasOwnProperty("name")); // 输出 trueconsole.log(obj.hasOwnProperty("email")); // 输出 falselet obj11 { name: "Joh…

9. 编程常见错误归类

编程常见错误归类 9.1 编译型错误9.2 链接型错误9.3 运行时错误 9.1 编译型错误 编译型错误⼀般都是语法错误&#xff0c;这类错误⼀般看错误信息就能找到⼀些蛛丝马迹的&#xff0c;双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误&#xff0c;随着语言的熟练…

力扣栈题:删除最外层括号

char* removeOuterParentheses(char* s) {int stack 0;int num0;for(int i0;i<strlen(s);i){if(s[i](){stack;if(stack>1){s[num]s[i];}}else{--stack;if(stack>0){s[num]s[i];}}}s[num]\0;return s; } 思路&#xff1a;迭代加栈&#xff0c;如果不是第一个的左括号则…

苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框…

win32汇编弹出对话框

之前书上有一个win32 asm 的odbc例子&#xff0c;它有一个窗体&#xff0c;可以执行sql&#xff1b;下面看一下弹出一个录入数据的对话框&#xff1b; 之前它在.code段包含2个单独的asm文件&#xff0c;增加第三个&#xff0c;增加的这个里面是弹出对话框的窗口过程&#xff0…

哪些AI知识库比较好用?企业高管必看!

在科技进步的时代&#xff0c;工作效率和知识管理是企业面临的两大挑战。而AI知识库&#xff0c;正是解决这个问题的利剑。接下来&#xff0c;我将与你分享三款好用的AI知识库平台&#xff0c;感兴趣就往下看吧。 首先&#xff0c;我们不得不提的是Helplook。这是一个根据人工智…

使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行数据库连接与操作&#xff1a;SQLite和MySQL 在现代应用程序开发中&#xf…

spring-boot-starter-thymeleaf加载外部html文件

在Spring MVC中&#xff0c;我们可以使用Thymeleaf模板引擎来实现加载外部HTML文件。 1.Thymeleaf介绍 Thymeleaf是一种现代化的服务器端Java模板引擎&#xff0c;用于构建漂亮、可维护且易于测试的动态Web应用程序。它适用于与Spring框架集成&#xff0c;并且可以与Spring M…

每日OJ题_牛客HJ12 字符串反转(IO型OJ)

目录 牛客HJ12 字符串反转 解析代码 牛客HJ12 字符串反转 字符串反转_牛客题霸_牛客网 解析代码 #include <iostream> using namespace std; int main() {string str "";cin >> str;int left 0, right str.size() - 1;while (left < right){ch…

Flink源码解析(1)TM启动

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

#每天一道面试题# 什么是MySQL的回表查询

MySQL中的索引按照物理存储的方式分为聚集索引和非聚集索引&#xff1b; 聚集索引索引和数据存储在一起&#xff0c;B树的叶子节点就是表数据&#xff0c;如果通过聚集索引查询数据&#xff0c;直接就可以查询出我们想要的数据&#xff1b;非聚集索引B树的叶子节点存储的是主键…

WebSocket 鉴权实践:从入门到精通

WebSocket 作为实时通信的利器&#xff0c;越来越受到开发者的青睐。然而&#xff0c;为了确保通信的安全性和合法性&#xff0c;鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制&#xff0c;为你呈现一揽子的解决方案&#xff0c;确保你的 WebSocket 通信得心应…

【C语言】【牛客】BC161 大吉大利,今晚吃鸡

文章目录 题目思路代码呈现 题目 链接: link 思路 这道题的本质其实不是考察C语言的运用&#xff0c;而是来考察我们对通项公式的总结。 我们可以看一下下面这道汉诺塔问题 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

&#x1f96e;背景 ComfyUI下使用IP-adapter下的faceID模型的时候&#xff0c;大家可能会遇到如下错误&#xff1a; Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…