Unittest框架的使用方法
程序员文章站
2024-03-21 23:14:58
...
一、UnitTest框架的使用
- python自带的一个单元测试的测试框架
- 可以结合selenium、request实现UI和接口的自动化测试
- 无需额外安装,python中已经加载了UnitTest框架
import unittest
- UnitTest框架中,有以下几个组件:
- test fixture :setUp(前置条件),tearDown(后置条件),用于初始化测试用例、清理释放资源
- test case :测试用例,以继承unittest.TestCase实现用例的继承,在UnitTest中,测试用例都通过test识别,所以在每个用例的命名上,必须要带上test,否则就不会识别
- test suite :测试套件,即测试用例集,list = (case1,case2…)
- test runner :运行器,通过runner调用suite执行测试
test report:生成测试报告
其对应关系为:
- UnitTest的运行机制:通过定义unittest.main()方法即可
import unittest
class Demo01(unittest.TestCase):
#类的初始化
@classmethod
def setUpClass(cls) -> None:
print('class')
#类的资源释放
@classmethod
def tearDownClass(cls) -> None:
print('tclass')
#初始化
def setUp(self) -> None:
print('setUp')
#释放资源
def tearDown(self) -> None:
print('tearDown')
#测试用例
def test_a(self):
print('a')
def test_b(self):
print('b')
if __name__=='__main__':
unittest.main()
二、UnitTest断言
- Unittest中,Testcast有封装好的断言方法进行断言,用于判断case通过或失败
-
如果断言通过, 测试会继续执行到下一行的代码
-
如果断言失败, 对应的case测试会立即停止或者生成错误信息,但是不要影响其他的case执行
以下是常见的一些断言方法:
序号 | 断言方法 | 断言描述 |
1 | assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail |
2 | assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail |
3 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
4 | assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
5 | assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
6 | assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
7 | assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
8 | assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
下面举例说明断言语句如何编写:
self.assertEqual("admin", driver.find_element_by_link_text("admin").text)
三、测试用例执行顺序
-
unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 0~9,A~Z,a~z 。
-
以下面的代码来看,执行顺序即为:test_1 ==> test_2 ==> test_3
# coding:utf8
import unittest
from selenium import webdriver
import time
class forTest(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Firefox()
self.driver.get("http://www.baidu.com")
def tearDown(self) -> None:
time.sleep(5)
self.driver.quit()
def test_1(self):
self.driver.find_element_by_id("kw").send_keys("大虞海棠")
self.driver.find_element_by_id("su").click()
def test_2(self):
self.driver.find_element_by_id("kw").send_keys("欣风雪雨")
self.driver.find_element_by_id("su").click()
def test_3(self):
self.driver.find_element_by_id("kw").send_keys("宅欣棠雪")
self.driver.find_element_by_id("su").click()
if __name__ == '__main__':
unittest.main()
四、UnitTest.skip用法
- 在case中,如果需要忽略某些用例或者特定条件下不执行的用例,那么就可以使用skip
- skip 是通过装饰器执行,无条件执行跳过操作,有一个参数,传入的内容会在控制台显示
- 如果使用 skipIf 将会有条件的执行跳过操作
# coding:utf8
import unittest
from selenium import webdriver
class Demo03(unittest.TestCase):
#初始化
def setUp(self):
print('setUp')
#释放资源
def tearDown(self):
print('tearDown')
#测试用例
#无条件执行跳过操作
@unittest.skip('不需要运行该条用例')
def test_a(self):
print('1')
def test_b(self):
print('2')
# 有条件执行跳过操作
@unittest.skipIf(1 < 2, '如果if条件是true就跳过')
def test_c(self):
print('3')
def test_d(self):
print('4')
@unittest.skipUnless(1 > 2, '如果unless条件是false就跳过')
def test_e(self):
print('5')
if __name__=='__main__':
unittest.main()
五、测试套件suite与Runner
- 方式一可以约定测试用例的执行顺序,让测试用例不必根据默认执行顺序执行
- 方式二是将测试用例组装成一个list
- 方式三是通过路径来访问每个类中的测试用例
- 方式四是根据具体的类执行某个类中所有的测试用例
# coding:utf8
import unittest
from demo.Demo03 import *
#创建一个测试套件
suite = unittest.TestSuite()
#给套件中添加测试用例
#方式一
suite.addTest(Demo03('test_2'))
suite.addTest(Demo03('test_1'))
suite.addTest(Demo03('test_3'))
#方式二
#case = [Demo03('test_2'), Demo03('test_1'), Demo03('test_3')]
#suite.addTests(case)
#方式三
#test_dir = './'
#discover = unittest.defaultTestLoader.discover(start_dir=test_dir, pattern='Demo*.py')
#方式四
#suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))
#通过TextTestRunner对象运行unittest.main()
runner = unittest.TextTestRunner()
runner.run(suite)
六、TestRoport测试报告
- 首先下载HTMLTestRunner.py 文件,下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html
- 因为HTMLTestRunner原先是适用于python2,所以需要对文件进行一些修改,然后导入到site-packages/lib文件夹中
# coding:utf-8
import unittest, os
from demo.Demo03 import *
from HTMLTestRunner import HTMLTestRunner
#创建一个测试套件
suite = unittest.TestSuite()
report_name = '测试报告名称'
report_title = '测试报告标题'
report_desc = '测试报告描述'
report_path = './report/'
report_file = report_path+'report.html'
if not os.path.exists(report_path):
os.mkdir(report_path)
else:
pass
with open(report_file, 'wb') as report:
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))
runner = HTMLTestRunner(steam=report, title=report_title, desc=report_desc)
runner.run(suite)
report.close()
七、DDT数据驱动
. 可以看出上面的每一个测试用例都是有重复的地方,所以采用DDT来简化代码,DDT包含类的装饰器ddt和两个方法装饰器data
-
data
::包含的参数与要输入测试的值一样多。 -
file_data
:将从JSON或YAML文件加载测试数据。
注:只有以“.yml”和“.yaml”结尾的文件作为YAML文件加载。所有其他文件都以JSON文件的形式加载。且文件如果是列表,那么列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。
from ddt import ddt,data,file_data,unpack
import unittest
@ddt
class MyTestDdt(unittest.TestCase):
def setUp(self):
print('start')
@data(2,4)#使用data传参数给测试用例
def test_one(self,value):
print(f'the @data number is :{value}')
def tearDown(self):
print('end')
if __name__ == '__main__':
unittest.main(verbosity=2)
推荐阅读
-
python 接口自动化测试框架-unittest框架的基本使用
-
Unittest框架的使用方法
-
python unittest框架的使用&解析
-
Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
-
python unittest 极简自动化测试框架:二、 BeautifulReport的使用简解,生成漂亮的报告
-
spring-mvc.xml的配置 博客分类: SSH框架 springmvcxml
-
使用Jquery+EasyUI框架开发项目+下载+帮助--EasyUI的简介 博客分类: 【EasyUI】 框架jqueryasp.netjavascript
-
Maven本地工程jar包的引用 博客分类: 框架 mavenjar本地
-
原创新闻 编写高性能Java代码的最佳实践 博客分类: java java框架jvmscala
-
最近正在重写我自己的数据库框架 博客分类: Java 框架SQLExcelJDBC