一、什么是Unittest框架

unittest是python自带的一个单元测试框架,不仅适用于单元测试,还可用于Web、Appium、接口自动化测试用例的开发与执行;此框架可以组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否执行通过,并生成测试结果。

二、Unittest框架原理

Unittest框架最核心的四个概念:

  1. test case:测试用例
  2. test suite:测试套件
  3. test runner: 用来执行测试用例和测试套件,并返回测试用例的执行结果
  4. TestLoader:批量执行测试用例
  5. test fixure:测试夹具

三、Unittest的使用

3.1 TestCase 测试用例

当我们在写接口用例的时候,会继承 unittest 当中的 TestCase 的类和方法,可以用来创建新的测试用例,一个TestCase的实例就是一个测试用例,unittest中的测试用例都是以 “test” 开头,并且它的执行顺序是按照方法名的ASCII值进行排序。

# test_001.py
import unittestdef add(x, y):return x + yclass Test_Case_01(unitest.TestCase):      # 新建测试类必须继承unittest.TestCase# 测试方法名称必须以 test 开头def test_add_01(self):  result = add(2, 4)print(f'两数和为:{result}')def test_add_02(self):result = add(5, 7)print(f'两数之和为:{result}')if __name__ == '__main__':# 执行测试用例unittest.main()

3.2 TestSuite

一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行,这就产生了TestSuite的概念。我们可以把它理解成一个篮子,篮子里面放了很多东西(test case)。使用addTest来加载TestCase到TestSuite中。

testsuit的使用:
(1)实例化:suite = unittest.TestSuite()
(2)添加用例:suite.addTest(ClassName(“MethodName”))
(ClassName:类名,MethodName:方法名)
(3)添加扩展:suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内 test 开头的方法,并添加到测试套件中)

提示: TestSuite需要配合TestRunner才能被执行

# 公众号:大森玩测试
# 案例import unittest
from test_001 import Test_Case_01# 实例化测试套件对象
suite = unittest.TestSuite()
# 单独添加测试用例
suite.addTest(Test_Case_01("test_add_01"))
suite.addTest(Test_Case_01("test_add_02"))# 批量添加用例, addTest()添加的次数根据Test_Case_01中的测试用例个数决定,这里是添加2次
suite.addTest(unittest.makeSuite(Test_Case_01))# 执行
runner = unittest.TextTestRunner()
runner.run(suite)

3.3 TextTestRunner

用来执行测试用例和测试套件,并返回测试用例的执行结果。在unittest单元测试框架中,通过TextTestRunner类提供的run()方法来执行test suite/test case。它还可以用图形或者文本接口,把返回的测试结果更形象的展现出来,如:HTMLTestRunner。

使用:
(1)实例化:runner = unittest.TextTestRunner()
(2)执行:runner.run(suite) # suite为测试套件的名称,可以参考上文的代码

# 示例代码可以参考3.2 TestSuite 的案例,这里不再赘述

3.4 TestLoader

用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件。

使用unittest.TestLoader(),通过该类下面的discover()方法自动搜索指定目录下指定开头的 .py 文件,并将查到的测试用例组装到测试套件。

# 示例
# 公众号:大森玩测试
import os
import unittest
# 获取根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   # 获取文件的根目录# 测试用例地址
test_case_path = os.path.join(BASE_DIR, "Scripts")suit = unittest.TestSuite()
loader = unittest.TestLoader()  # 专门用来查找用例的实例
# test_case_path:测试用例的所在路径。pattern:搜索以test开头的py文件,默认为‘test*.py’
suit.addTests(loader.discover(test_case_path, pattern="test*.py"))runner = unittest.TextTestRunner()
runner.run(suit)

注意: 也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader()

discover = unittest.defaultTestLoader.discover(test_case_path, pattern="t*.py")
suit.addTests(discover)

TestSuite和TestLoader的区别

共同点:都是测试套件

不同点:实现方式不同

(1) TestSuite需要手动添加测试用例(可以添加测试类,也可以添加测试类中的某个测试方法)

(2)TestLoader搜索指定目录下指定开头的py文件,并添加测试类中的所有测试方法,不能指定添加某个测试方法

3.5 Fixture

是对一个测试用例环境的初始化和销毁操作。即执行测试用例前准备环境的搭建(前置-SetUp),以及测试后环境的还原(后置-TearDown)。

控制级别:

(1)函数级别
def setUp() / def tearDown()
特性:几个测试函数,被执行几次。每个测试函数执行之前都会执行setUp,执行之后都会执行tearDown(运行一次测试方法就会运行一次 setUp 和 tearDown)

(2)类级别
def setUpClass() / def tearDownClass()
特性:测试类运行之前运行一次setUpClass;类运行之后运行一次tearDownClass

注意: 类方法必须使用 @classmethod装饰

(3)模块级别
def setUpModule() / def tearDownModule()
特性:模块运行之前执行一次 setUpModule;模块运行之后执行一次 tearDownModule

# 示例
# 公众号:大森玩测试
import time
import unittest
from selenium import webdriverclass Test_Tmall_Login(unittest.TestCase):def setUp(self) -> None:# 获取Chrome浏览器驱动对象self.driver = webdriver.Chrome()# 打开urlself.driver.get("http://www.tmall.com")# 窗口最大化self.driver.maximize_window()# 隐式等待self.driver.implicitly_wait(30)def tearDown(self) -> None:# 等待3秒,关闭浏览器time.sleep(3)self.driver.quit()def test_login(self):driver = self.driver# 输入用户名driver.find_element(by="id", value="username").send_keys("test001")# 输入密码driver.find_element(by="id", value="password").send_keys("admin001")# 点击登录按钮driver.find_element(by="name", value="sbtbutton").click()

四、断言

1)什么是断言

让程序代替人工自动的判断预期结果和实际结果是否相符

2)为什么要学习断言

自动化脚本在执行的时候一般都是无人值守状态,我们不知道执行的结果是否符合预期结果,所以需要让程序代替人工检测程序执行的结果是否符合预期结果,这个时候就需要用到断言。

3) Unittest常用断言方法

注意: 如果断言失败(用例执行不通过)就会抛出一个AssertionError断言错误,成功则标识为通过,以上几种方式都有一个共同点,就是都有一个msg参数,默认是None,即msg = None,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

断言方法在unittest.TestCase类中已经定义好了,我们自定义的测试类已经继承了 TestCase ,所以在测试方法中直接调用即可。

# 示例
# 公众号:大森玩测试
import unittestdef add(x, y):return x + yclass Test_Assert(unittest.TestCase):def setUp(self):print("前置操作")def tearDown(self):print("后置操作")# 测试用例def test_01(self):result = add(2, 4)# 断言self.assertEqual(2, result)def test_02(self):result = add(5, 7)is_ok = result == 12self.assertTrue(is_ok)def test_03(self):result = add(2, 3)result = str(result)self.assertIn(result, "1234567")

五、参数化

1)通过参数的方式来传递数据,从而实现数据和脚本分离,也可以把测试数据定义到数据文件或者数据库中

2)针对同一个测试方法,可以实现用例的重复执行,减少代码冗余,提高测试效率

3) unittest测试框架,本身不支持参数化,但是可以通过安装扩展插件parameterized来实现

安装

pip install parameterized

使用方式

导包:from parameterized import parameterized

修饰测试函数 @parameterized.expand([数据])

数据格式:

  1. 单个参数:类型为列表

  2. 多个参数:类型为列表嵌套元组

  3. 在测试函数中的参数设置变量引用参数值,注意:变量的数量必须和数据值的个数相同

六、跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行。

使用方式

1.直接将测试函数标记成跳过

@unittest.skip('代码未完成')

2.根据条件判断测试函数是否跳过

@unittest.skipIf(condition, reason)

七、生成HTML测试报告

测试脚本执行完后,可以生成以 HTML( 网页 ) 格式的测试报告。

这里给大家推荐一个个人感觉不错的HTMLTestRunner版本——XTestRunner

安装方式:

pip install XTestRunner

pip install -U git+https://github.com/SeldomQA/XTestRunner.git@master

使用:

# 注意:生成HTML报告,必须使用wb,以二进制形式写入
with open(report_dir, "wb") as f :HTMLTestRunner(stream=f, verbosity=2, title="XXX自动化测试报告", description="欢迎关注公众号:大森玩测试")

UnitTest单元测试框架详解相关推荐

  1. python测试框架untest怎么循环执行_Python自动化测试-Unittest单元测试框架详解

    python中unittest模块是用来做单元测试的. unittest是一个python版本的junit,junit是java中的单元测试框架,对java的单元测试,有一句话很贴切:Keep the ...

  2. python自动化测试框架有哪几种_Python自动化测试-Unittest单元测试框架详解

    python中unittest模块是用来做单元测试的. unittest是一个python版本的junit,junit是java中的单元测试框架,对java的单元测试,有一句话很贴切:Keep the ...

  3. 软件测试——Unittest单元测试框架详解

    一,前言 1,单元测试 软件测试一般按阶段划分为:单元测试,集成测试,系统测试.单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证. 单元测试中单元的含义,单元就是人为规定 ...

  4. C语言单元测试框架详解:第一篇

    目录 一.单元测试定义 二.C语言单元测试框架汇总 三.C语言测试推荐书籍 一.单元测试定义 单元测试是指对软件中的最小可测试单元进行检查和验证,如C语言中单元指一个函数,Java里单元指一个类.单元 ...

  5. 【07节】Python3+Selenium4自动化 unittest 测试框架详解

    文章目录 1.unittest 框架介绍 2.创建单元测试步骤 3.unittest 模块介绍 3.1 TestCase 类 3.1.1 TestCase 类常用方法: 3.1.2 TestCase ...

  6. Appium+python自动化(三十二)- 代码写死一时爽,框架重构火葬场 - PageObject+unittest(超详解)...

    简介 江湖有言:"代码写死一时爽,框架重构火葬场",更有人戏言:"代码动态一时爽,一直动态一直爽?",虽然听起来有点耸人听闻,但也没有想象中的那么严重,我们在开 ...

  7. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  8. shiro放行_Shiro框架详解 tagline

    部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...

  9. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

最新文章

  1. sql中将分隔字符串转为临时表的方法
  2. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测大气压( air pressure)+代码实战
  3. 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
  4. linux socket 缓冲区默认大小
  5. Elasticsearch 字段数据类型
  6. Android中SQLiteDatabase操作【附源码】
  7. Struts2源码阅读(二)_ActionContext及CleanUP Filter
  8. 批处理通过字符串截取得到文件名
  9. 《剑指Offer》 变态跳台阶
  10. android超级管理员权限作用,Android获取超级管理员权限的实现
  11. 避免编写解决不存在问题的代码
  12. 使用Sklearn模型做分类并绘制机器学习模型的ROC曲线
  13. c语言输入角度求sin,从键盘输入一个角度x,求10sin(x)的值 c语音编程
  14. initialize
  15. Excel教程视频《Excel大神上分攻略》50个工作场景,从案例到实践
  16. 计算机辅助项目管理课程方案,计算机辅助项目管理课程设计_大学论文.docx
  17. 你今天真好看中文扫描版
  18. 遗传算法中常用的选择策略
  19. 一文详解 Band Protocol :预言机博弈中的价值输出
  20. 电影之记忆1:V字仇杀队

热门文章

  1. 博士申请 | 香港中文大学岳翔宇老师招收人工智能全奖博士/博后/RA/实习生
  2. 关于windows10自动升级 电脑重启 蓝屏
  3. Unity 3D学习(三) - 网络通信
  4. 贪吃蛇源码注释过程(未完成)
  5. 元宇宙迷思:你能躲得开元宇宙吗?
  6. 怎样快速上手PPT制作?
  7. 2021-08-13——最终项目(待完善)-对比21世纪中美两国在夏季奥运会上的奖(金)牌数量
  8. HBuilder X不能运行到内置终端
  9. PyQt5 简单范例
  10. 一个在线jpg png转ICO的网站