[Python unittest] 3-Organizing test code
组织测试代码
前面已经了解到测试的原理和步骤,但只是默认类string的测试,如果是我们自己写的类改怎么测试呢?
如下
class Widget(object):def __init__(self,name,width=50,height=50):self.name = nameself.width = widthself.height = heightdef __repr__(self):return "Widget({0})".format(self.name)# 返回大小def size(self):return (self.width, self.height)#重设大小def resize(self, *args):try:self.width = args[0]self.height = args[1]except:passreturn self.size()#其他方法def dispose(self):print '这里是tearDown'pass
测试用例可以这样写
import unittestclass DefaultWidgetSizeTestCase(unittest.TestCase):def runTest(self):widget = Widget('The widget')self.assertEqual(widget.size(), (50, 50), 'incorrect default size')
结果
python -m unittest users.tests.DefaultWidgetSizeTestCase . ---------------------------------------------------------------------- Ran 1 test in 0.000sOK
实际情况中,如果对该类我们有一百个测试用例需要写,难道要写100次widget = Widget('The widget')吗?我们猿类的服务宗旨是什么?从不写重复的代码
所以unittest给我们提供了setup,setup是每一个测试用例runTest之前都会执行的函数,相当于给我们提供了一个准备环境的方法import unittestclass SimpleWidgetTestCase(unittest.TestCase):def setUp(self):self.widget = Widget('The widget') class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):def runTest(self):self.assertEqual(self.widget.size(), (50,50),'incorrect default size')class WidgetResizeTestCase(SimpleWidgetTestCase):def runTest(self):self.widget.resize(100,150)self.assertEqual(self.widget.size(), (100,150),'wrong size after resize')
python -m unittest users.tests .. ---------------------------------------------------------------------- Ran 2 tests in 0.000sOK
两个有 runTest 的测试用例都自动执行了父类的setup函数,当setup出错后,测试用例就不会执行了
相似的,unittest提供了在测试用例执行之后可以自动执行的方法tearDown,可以让我们做一些自己需要的事
class SimpleWidgetTestCase(unittest.TestCase):def setUp(self):self.widget = Widget('The widget')def tearDown(self):self.widget.dispose()self.widget = None
python -m unittest users.tests 这里是tearDown .这里是tearDown . ---------------------------------------------------------------------- Ran 2 tests in 0.000sOK
只要setup成功,不论测试用例是否正确,tearDown都会执行
现在每一个测试用例都要继承相同的测试夹具,这让人感觉很不舒服,unittest提供了如下办法,很像java的JUnitclass WidgetTestCase(unittest.TestCase):def setUp(self):self.widget = Widget('The widget')def tearDown(self):self.widget.dispose()self.widget = Nonedef test_default_size(self):self.assertEqual(self.widget.size(), (50,50),'incorrect default size')def test_resize(self):self.widget.resize(100,150)self.assertEqual(self.widget.size(), (100,150),'wrong size after resize')
python -m unittest users.tests.WidgetTestCase 这里是tearDown .这里是tearDown . ---------------------------------------------------------------------- Ran 2 tests in 0.000sOK
这里没有runTest函数,而是用test_开头的方法代替,每一个test_开头的方法都会被当作一个测试独立运行,包括setup和tearDown也是独立的
如果只想运行部分测试用例改怎么办呢?if __name__ == '__main__':widgetTestSuite = unittest.TestSuite()widgetTestSuite.addTest(WidgetTestCase('test_default_size'))widgetTestSuite.addTest(WidgetTestCase('test_resize'))#suite = unittest.TestLoader().loadTestsFromTestCase(WidgetTestCase)unittest.TextTestRunner(verbosity=2).run(widgetTestSuite)
将你想运行的测试用例加入TestSuite
python */users/tests.py test_default_size (__main__.WidgetTestCase) ... 这里是tearDown ok test_resize (__main__.WidgetTestCase) ... 这里是tearDown ok---------------------------------------------------------------------- Ran 2 tests in 0.001sOK
或者将你想测试的类加载为suite,可以测试整个类的所有用例
if __name__ == '__main__':#widgetTestSuite = unittest.TestSuite()#widgetTestSuite.addTest(WidgetTestCase('test_default_size'))#widgetTestSuite.addTest(WidgetTestCase('test_resize'))suite = unittest.TestLoader().loadTestsFromTestCase(WidgetTestCase)unittest.TextTestRunner(verbosity=2).run(suite)
python */users/tests.py test_default_size (__main__.WidgetTestCase) ... 这里是tearDown ok test_resize (__main__.WidgetTestCase) ... 这里是tearDown ok---------------------------------------------------------------------- Ran 2 tests in 0.001sOK
更美观的做法是
if __name__ == '__main__':def suite():suite = unittest.TestSuite()suite.addTest(WidgetTestCase('test_default_size'))suite.addTest(WidgetTestCase('test_resize'))return suitedef suite_map():tests = ['test_default_size', 'test_resize']return unittest.TestSuite(map(WidgetTestCase, tests))unittest.TextTestRunner(verbosity=2).run(suite())
python */users/tests.py test_default_size (__main__.WidgetTestCase) ... 这里是tearDown ok test_resize (__main__.WidgetTestCase) ... 这里是tearDown ok---------------------------------------------------------------------- Ran 2 tests in 0.000sOK
有时候需要阻止各个测试用例,很简单测试套件TestSuite像TestCase一样被加入TestSuite
if __name__ == '__main__':def suite():suite = unittest.TestSuite()suite.addTest(WidgetTestCase('test_default_size'))suite.addTest(WidgetTestCase('test_resize'))return suitedef suite_map():tests = ['test_default_size', 'test_resize']return unittest.TestSuite(map(WidgetTestCase, tests))alltest = unittest.TestSuite([suite(), suite_map()])unittest.TextTestRunner(verbosity=2).run(alltest)
python */users/tests.py test_default_size (__main__.WidgetTestCase) ... 这里是tearDown ok test_resize (__main__.WidgetTestCase) ... 这里是tearDown ok test_default_size (__main__.WidgetTestCase) ... 这里是tearDown ok test_resize (__main__.WidgetTestCase) ... 这里是tearDown ok---------------------------------------------------------------------- Ran 4 tests in 0.001sOK
测试代码可以放在任何地方,不过有几个原则需要注意:
- 测试模块可以独立在命令行执行
- 测试代码可以很容易的从项目中分离出来
- 没有合理的理由不要改变测试代码来适应它所测试的代码
- 代码的修改应该比测试代码的修改频繁的多
- 被测试代码重构更容易
- 用C编写的模块的测试无论如何必须是独立的模块,那么为什么不一致呢?
- 测试策略发生变化,不需要更改源代码
转载于:https://www.cnblogs.com/lazySmeagol/p/7452460.html
[Python unittest] 3-Organizing test code相关推荐
- python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...
基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...
- Python unittest –单元测试示例
Today we will learn about python unittest and look through python unit test example programs. In pre ...
- Python+unittest+requests 接口自动化测试框架搭建 完整的框架搭建过程 实战
一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm ...
- 简单实现接口自动化测试(基于python+unittest)
简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Pytho ...
- vscode写python爬虫_用 VS Code 写 Python,这8个扩展装上后无敌了!
1. Python extension for Visual Studio Code 这个扩展是由微软官方提供的,支持但不仅限于以下功能: 通过Pylint或Flake8支持代码检查 在VS Code ...
- python单元测试框架-Python unittest单元测试框架总结
什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入 ...
- visual studio code python插件下载_visual studio code 的必装推荐插件plugin, vscode, vsc
An Old Hope Theme (theme, 推荐,且推荐它的 classic theme,安装后在颜色选项里选择,该插件的定制见文末) Cobalt2 (theme) Drac ...
- pythonunittest接口测试_基于python+unittest +requests接口测试
2019独角兽企业重金招聘Python工程师标准>>> 谈到接口测试,大家都不会感到陌生.接口测试的工具和实现方式也有很多,比如ant+jmeter+jemkins.postman. ...
- python unittest断言_python unittest之断言及示例
assert.png 前言 python unintest单元测试框架提供了一整套内置的断言方法. 如果断言失败,则抛出一个AssertionError,并标识该测试为失败状态 如果异常,则当做错误来 ...
- Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例
Python+Unittest+HTMLTestRunner测试报告-百度个人中心实例 环境配置:https://blog.csdn.net/sevensolo/article/details/100 ...
最新文章
- c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
- V8 Profiler 揭秘
- 出现could not find developer disk image解决办法和不受信任的开发者
- .Net Core应用框架Util介绍(三)
- python seaborn boxplot_python - 如何将文本框添加到Seaborn Boxplot? - 堆栈内存溢出
- python在windows系统中安装pandas,numpy
- SLAM GMapping(6)扫描匹配器
- python 写入excel_基于Python实现Excel的读写
- Eclipse常用开发插件(转)
- Word 里面如何设置多级标题
- android 发布最新系统更新包,安卓升级包(安卓补丁包更新)
- 施一公:优秀的科学家如何成长?
- 一周企业财报 | 汉高、中通、格林酒店、宜人金科、宝尊、维他奶等7家企业发布业绩...
- HTTP协议 (三) 代理
- c语言数码管显示小数点,8位数码管显示正整数和小数及解决鬼影问题
- 更改Linux系统的主机名(hostname)两种实用的方法
- 软考知识点---20标准化与法律法规
- STM32GPIO寄存器CRL、CRH、IDR、ODR、BSRR、BRR
- java加载tensorflow训练的PB模型记录
- vue项目 报sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR_
热门文章
- RedHat YUM configure
- C语言中“数组名”和“数组名”
- OpenGL动感模糊
- pat天梯赛L1-052. 2018我们要赢
- sudo apt-get update 出错 Updating from such a repository can‘t be done securely, and is therefore
- Android7.0 PowerManagerService亮灭屏分析(二)
- JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
- redis 读取mysql数据类型_认识Redis与Redis的数据类型
- linux npm安装_手把手教你appium框架的搭建—linux
- nginx重新加载php,如何使用nginx启动、停止和重新加载