2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python单元测试框架之unittest+requests+ddt+excel接口自动化测试

Python单元测试框架之unittest+requests+ddt+excel接口自动化测试

时间:2022-10-19 22:15:51

相关推荐

Python单元测试框架之unittest+requests+ddt+excel接口自动化测试

unitetest是python里单元测试框架,是基于 java 的 junit 测试框架相当于是一个 python 版的 junit,除了 unittest,还有一个 pytest 框架

unittest.TestCase:TestCase类,所有测试用例类继承的基本类

一个TestCase的实例就是一个测试用例。一个测试用例要包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证

unittest.main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行

一、setUp()和tearDown()函数

setUp()函数是在众多函数或说是在一个类里最先被调用的函数,每执行完一个函数都要从setUp()调用开始后再执行下一个函数,有几个函数几次,与位置无关,随便放在那里都是他先被调用。

tearDown()函数是在众多函数执行完后他才被执行,不管这个类里面有多少函数,他总是最后一个被执行,与位置无关,放在那里都行,最后不管测试函数是否执行成功都执行tearDown()方法;如果setUp()方法失败,则认为这个测试项目失败,不会执行测试函数也不执行tearDown()方法。

1、setUp()和tearDown()方法都是非必要条件,如果没有也可以写pass

2、setUp()和tearDown()方法每个测试用例都会执行,先执行前置setUp,然后执行的用例(test*),最后执行的后置tearDown

3、setUp():setUp()方法用于测试用例执行前初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器

4、tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接、关闭浏览器

5、未加装饰器,先执行前置setUp,再执行test开头的test01,最后执行后置tearDown,继续循环所有用例;加了装饰器@classmethod,先执行setUp,再执行test开头的所有用例,最后执行tearDown

#未加装饰器,先执行前置setUp,再执行test开头的测试用例,最后执行后置tearDown,继续循环所有用例import unittestclass Test(unittest.TestCase):#继承unittest.TestCase这个类def setUp(self):#测试用例执行前运行print('setUp__')def tearDown(self):#测试用例结束后运行print('tearDown')def testMinus(self): #测试用例名称以test开头'''这里是减法'''print('这里是减法')result=6-5hope=1self.assertEqual(result,hope)def testDivide(self):'''这里是除法'''print('这里是除法')result=7/2hope=3.5self.assertEqual(result,hope)if __name__ == '__main__':unittest.main()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.pysetUp__这里是除法tearDownsetUp__这里是减法tearDown..----------------------------------------------------------------------Ran 2 tests in 0.000sOKProcess finished with exit code 0

#加了装饰器@classmethod,先执行setUp,再执行test开头的所有用例,最后执行tearDownimport unittestclass Test(unittest.TestCase):@classmethoddef setUpClass(cls):print('setUp__')@classmethoddef tearDownClass(cls):print('tearDown')def test_003(self):''这里是test_003'''print('这里是减法')result=6-5hope=1self.assertEqual(result,hope)def test_004(self):''这里是test_004'''print('这里是除法')result=7/2hope=3.5self.assertEqual(result,hope)if __name__ == '__main__':unittest.main()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.pysetUp__..这里是减法这里是除法tearDown----------------------------------------------------------------------Ran 2 tests in 0.001sOKProcess finished with exit code 0

二、unittest.defaultTestLoader(): defaultTestLoader()类

通过该类下discover()方法将测试目录匹配查找测试用例文件(test*.py),将查找的测试用例组装到测试套件TestSuite,再返回一个TestSuite实例,因此可以直接通过run()方法执行discover

discover方法来加载用例,discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,用TextTestRunner这里类的run方法去执行,discover方法里面有三个参数:

case_dir:这个是待执行用例的目录

pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

top_level_dir:这个是顶层目录的名称,一般默认等于None就行了

# 测试用例路径(当前文件目录)case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>

class Test(unittest.TestCase):def setUp(self):print('数据准备阶段')def tearDown(self):print('数据清理结束')def test01(self):print('输出test01')def test02(self):print('输出test02')if __name__=='__main__':# 测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#调用实例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py..<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>----------------------------------------------------------------------数据准备阶段Ran 2 tests in 0.001s输出test01数据清理结束OK数据准备阶段输出test02数据清理结束Process finished with exit code 0

三、unittest.TestSuite():unittest框架的TestSuite()类

用来创建测试套件,多个测试用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite

对于某一个功能模块的验证可能需要多个测试用例,多个测试用例集合在一起执行验证某一个功能,这样就是一个TestSuite。通过addTest()方法将 TestCase 加载到 TestSuite()中,最终将传递给testRunner进行测试执行

四、unittest.TextTestRunner():unittest框架的TextTestRunner()类

通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件

runner=unittest.TextTestRunner()

runner.run(all_case())

class Test(unittest.TestCase):def setUp(self):print('数据准备阶段')def tearDown(self):print('数据清理结束')def test01(self):print('输出test01')def test02(self):print('输出test02')if __name__=='__main__':# 测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#调用实例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py..<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>----------------------------------------------------------------------数据准备阶段Ran 2 tests in 0.001s输出test01数据清理结束OK数据准备阶段输出test02数据清理结束Process finished with exit code 0

五、生成html报告,report_path是存放测试报告的地址

stream:测试报告写入文件的存储区域

title:测试报告的主题

description:测试报告的描述

#实例化runnerrunner=unittest.TextTestRunner()#测试报告存放地址report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html")#打开fp = open(report_path, "wb")#写入runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自动化测试报告",description="用例执行情况:")#调用实例run方法runner.run(discover)#关闭fp.close()

import unittest,osimport HTMLTestRunnerclass Test(unittest.TestCase):def setUp(self):print('setup数据准备阶段——————')def tearDown(self):print('teardown数据清理收尾阶段————')def test01(self):print('执行test01测试用例')def test02(self):print('执行test02测试用例')if __name__=='__main__':#测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#测试报告存放地址report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html")#打开fp = open(report_path, "wb")#写入runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自动化测试报告",description="用例执行情况:")#调用实例run方法runner.run(discover)#关闭fp.close()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py..setup数据准备阶段——————执行test01测试用例----------------------------------------------------------------------teardown数据清理收尾阶段————Ran 2 tests in 0.002ssetup数据准备阶段——————执行test02测试用例OKteardown数据清理收尾阶段————Process finished with exit code 0C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py..<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]><_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00.001000Process finished with exit code 0

参考代码# coding:utf-8import unittestimport osimport HTMLTestRunner# python2.7要是报编码问题,就加这三行,python3不用加import sysreload(sys)sys.setdefaultencoding('utf8')# 用例路径case_path = os.path.join(os.getcwd(), "case")# 报告存放路径report_path = os.path.join(os.getcwd(), "report")def all_case():discover = unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None)print(discover)return discoverif __name__ == "__main__":# runner = unittest.TextTestRunner()# runner.run(all_case())# html报告文件路径report_abspath = os.path.join(report_path, "result.html")fp = open(report_abspath, "wb")runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自动化测试报告,测试结果如下:',description=u'用例执行情况:')# 调用add_case函数返回值runner.run(all_case())fp.close()

六、unittest.skip():装饰器

当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽

@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因

@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因

@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。

@unittest.expectedFailure(): expectedFailure()测试标记为失败

七、断言

assertEqual(self, first, second, msg="失败原因")

unittest 常用的断言方法

1.assertEqual(self, first, second, msg=None)

--判断两个参数相等:first == second

2.assertNotEqual(self, first, second, msg=None)

--判断两个参数不相等:first != second

3.assertIn(self, member, container, msg=None)

--判断是字符串是否包含:member in container

4.assertNotIn(self, member, container, msg=None)

--判断是字符串是否不包含:member not in container

5.assertTrue(self, expr, msg=None)

--判断是否为真:expr is True

6.assertFalse(self, expr, msg=None)

--判断是否为假:expr is False

7.assertIsNone(self, obj, msg=None)

--判断是否为 None:obj is None

8.assertIsNotNone(self, obj, msg=None) --判断是否不为 None:obj is not None

八、数据驱动DDT

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。