UnitTest

news/2024/11/15 16:46:23/文章来源:https://www.cnblogs.com/SakuraYuanYuan/p/17938581

UnitTest框架
是Python自带的单元测试框架,也可以用来做自动化测试(管理和执行用例)
核心要素(组成):
1、TestCase(测试用例)
2、TestSuite(测试套件):打包TestCase
3、TestRunner(测试执行):执行Testsuite
4、TestLoader(测试加载):对TestSuite的补充,也是打包TestCase的
5、Fixture(测试夹具):一种代码结构,书写前置方法(执行用例之前的方法)和后置方法(执行用例之后的方法)

 

单个用例创建及执行

import unittest# 定义测试类(只要继承unittest.TestCase类,就是测试类)
class TestDemo(unittest.TestCase):# 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test01(self):print('测试方法一')def test02(self):print('测试方法二')# 执行
if __name__ == '__main__':unittest.main()

 

多个用例及执行

test_01.py

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

test_02.py

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

testSuite_Runner.py

import unittest
from test_01 import TestDemo01
from test_02 import TestDemo02suite = unittest.TestSuite()  # 实例化套件对象
# 方法一:往测试套件里添加测试类中的某一个测试方法
#suite.addTest(TestDemo01('test01'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo01('test02'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo02('test01'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo02('test02'))  # 套件对象.addTest(测试类名('测试方法名'))# 方法二:往测试套件里添加测试类下所有的测试方法
#suite.addTest(unittest.makeSuite(TestDemo01))
#suite.addTest(unittest.makeSuite(TestDemo02))# 方法三:用TestLoader发现所有案例,得到的是套件对象
suite = unittest.TestLoader().discover('.', 'test_*.py')runner = unittest.TextTestRunner()  # 实例化执行对象
runner.run(suite)  # 执行对象.run(套件对象)

 

 

fixture的使用

testCases.py

import unittestclass TestLogin(unittest.TestCase):# 前置类方法
    @classmethod    # 类方法,需要添加装饰器def setUpClass(cls):print('1.open brower')# 后置类方法
    @classmethoddef tearDownClass(cls):print('9.close brower')# 前置方法def setUp(self):print('2.input url')print('3.click login')# 后置方法def tearDown(self):print('7.click logout')print('8.close url')def testLogin1(self):print('4.input user 1')print('5.input password 1')print('6.click login button')def testLogin2(self):print('4.input user 2')print('5.input password 2')print('6.click login button')if __name__ == '__main__':unittest.main()

 

 testRunner.py

import unittestsuite = unittest.TestLoader().discover('.', 'testCases.py')
unittest.TextTestRunner().run(suite)

# 执行结果如下

1.open brower  # 前置类方法
2.input url  # 前置方法
3.click login
4.input user 1
5.input password 1
6.click login button
7.click logout  # 后置方法
8.close url
.2.input url  # 前置方法
3.click login
4.input user 2
5.input password 2
6.click login button
7.click logout  # 后置方法
8.close url
.9.close brower # 后置类方法

 

断言

tools.py

def add(a, b):return a + b

assert_case.py

import unittest
from tools import addclass AssertCase(unittest.TestCase):def test01(self):## 测试类.assertEqual(预期结果,实际结果)self.assertEqual(2, add(1, 1))def test_assert_not_equal2(self):self.assertEqual(3, add(1, 2))def test_assert_in3(self):## 测试类.assertIn(预期结果,实际结果集) 预期结果在实际结果集里面self.assertIn(add(2, 3), [5, 6, 7])if __name__ == '__main__':unittest.main()

assert_runner.py

import unittest
from assert_case import AssertCasesuite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(AssertCase))unittest.TextTestRunner().run(suite)

 

断言+参数化(paramterized需要提前用pip安装)

 

 assert_case.py

import unittest
import json
from tools import add
from parameterized import parameterized# data = [(2, 1, 1), (3, 1, 2), (4, 2, 2), (5, 3, 2)]   # 方法一 将数据源直接写在Python文件中# 方法二 将数据源写在json文件中
with open('data.json', encoding='utf-8') as f:data = json.load(f)  # [[2, 1, 1], [3, 1, 2], [4, 2, 2], [5, 3, 2]]class AssertCase(unittest.TestCase):@parameterized.expand(data)     # 直接取数据源列表[(),()]def test01(self, excpect, a, b):### 测试类.assertEqual(预期结果,实际结果)
        self.assertEqual(excpect, add(a, b))if __name__ == '__main__':unittest.main()

assert_runner.py

#import unittest
#from assert_case import AssertCase#suite = unittest.TestSuite()
#suite.addTest(unittest.makeSuite(AssertCase))# unittest.TextTestRunner().run(suite)# 生成测试报告(替换下runner对象)
import unittest
from htmltestreport import HTMLTestReport
from assert_case import AssertCasesuite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(AssertCase))HTMLTestReport('HTMLTestReport.html', 'TestRepoer', 'This is a test report.').run(suite)

 

 

跳过

import unittest
v = 2class SkipCase(unittest.TestCase):@unittest.skip('暂时不想执行')def testCase01(self):print('test01')@unittest.skipIf(v >= 2, '版本大于等于2就不执行')def testCase02(self):print('test02')def testCase03(self):print('test03')if __name__ == '__main__':unittest.main()

 

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

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

相关文章

帝国CMS网站什么是远程保存忽略地址?

什么是远程保存忽略地址?在此列表里的网站/地址将不会将文件远程保存本地扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HT…

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version

错误记录: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near DEFAULT CHARSET=gbk at line 51 错误原因: 你新服务器上使用的是mysql4.0,而你原服务器使用的是4.1以上版本的原故。…

Got error 28 from table handler

错误记录: Got error 28 from table handler 错误原因: 数据库所在磁盘空间已满。 解决方案: 1.虚拟主机用户请联系空间商增加 MySQL 所在的磁盘空间或者清理一些无用文件; 2.独立主机用户请联系服务器管理员增加 MySQL 所在的磁盘空间或者清理一些无用文件。一般网站日志文…

帝国CMS网站采集入库错误 Fatal error: Call to undefined function: imagettfbbox() in ..../e/class/gd.php ..

采集入库错误 Fatal error: Call to undefined function: imagettfbbox() in ..../e/class/gd.php ..解答:你的空间的gd库不支持文字水印,推荐采用图片水印。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascr…

discuz数据库配置文件是哪个?怎样修改数据库配置信息?

网站系统需要修改的位置有两处 Discuz 和 UC-center  ①路径:/wwwroot/config/config_global.php 这个根据你网站安装的路径而定。  打开 config_global.php 文件修改:$_config[db][1][dbpw] = 原来密码;  原来密码 修改为新的数据库密码。  ②路径:/wwwroot/uc_serv…

matlab将.m文件导出dll

根据项目需要,需要这边引用matlab的函数进行数据处理,首先考虑是将matlab代码直接导出成c/c++代码,但是由于matlab代码中引用了其他的matlab库函数,无法直接导成c/c++代码,退而求其次,转而考虑导出为dll文件 1、需要安装matlab和vs,目前分别是2016版本和2022版本 导出步…

HR 专业人士: 持续绩效考核指南 CPM

这可能有悖于直觉,但解决每个人似乎都不喜欢绩效评估的问题,就是要有更多的绩效评估。如果你的组织在过去使用过绩效考核,而且是一种不怎么好的体验,那你就来对地方了。好消息是你并不孤单。害怕绩效考核的过程,以及对其效果不甚满意,是一个常见的问题。 不过,如果你让我…

计算机网络第四讲 网络层

计算机网络第四讲 网络层第一节:网络层概述 1. 网络层概述2. 网际协议IP3. 小结第二节:IP地址\(\bigstar \bigstar \bigstar \bigstar \bigstar\) 1. IP地址2. 基本分类IP地址特殊IP 全零:本,作为源地址 全1:全网广播,作为目的地址 网络号:127作为本地换回测试3. 划分子…

加密解密你了解多少?

这个题目一写出来,笔者自己也思考了下自己在以前职业生涯中涉及到的加密解密技术,也思考了自己熟知的公知度高的几种加密方式。 下面我来说说一些理解上的东西。 加密解密中间参与的是一个算法,有这个算法规律你才可以将简单的语言或者数据转换成只有了解此算法的人才能看懂…

【YashanDB知识库】IMP跨网络导入慢问题

问题现象 问题单:imp性能慢-通过异机导入性能下降太多-镜像环境可重现 现象: 同样一份数据290M, 在同一个机器本地导入,耗时2分钟多,本机用ip连接导入耗时4分钟多, 跨机器导入,耗时17分钟多,客户现场耗时30分钟多。 问题风险及影响 客户导入慢 问题影响的版本 客户测试…

神经网络之卷积篇:详解计算机视觉(Computer vision)

详解计算机视觉 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习。深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们。还使得人脸识别技术变得更加效率和精准,即将能够体验到或早已体验过仅仅通过刷脸就能解锁手机或者门锁。当解锁了手机,…

Typora图片即时上传

Typora图片即时上传声明:以下转载自:博客园markdown上传文件及图片 - jaysonteng - 博客园 (cnblogs.com) 使用Typora写博客,图片即时上传,无需第三方图床-EasyBlogImageForTypora - xhznl - 博客园 (cnblogs.com)感谢此文所引用的文章的作者提供的优质学习资源,如有侵犯,…