• 组织测试代码

    前面已经了解到测试的原理和步骤,但只是默认类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的JUnit

    class 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相关推荐

  1. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  2. Python unittest –单元测试示例

    Today we will learn about python unittest and look through python unit test example programs. In pre ...

  3. Python+unittest+requests 接口自动化测试框架搭建 完整的框架搭建过程 实战

    一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm ...

  4. 简单实现接口自动化测试(基于python+unittest)

    简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Pytho ...

  5. vscode写python爬虫_用 VS Code 写 Python,这8个扩展装上后无敌了!

    1. Python extension for Visual Studio Code 这个扩展是由微软官方提供的,支持但不仅限于以下功能: 通过Pylint或Flake8支持代码检查 在VS Code ...

  6. python单元测试框架-Python unittest单元测试框架总结

    什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入 ...

  7. visual studio code python插件下载_visual studio code 的必装推荐插件plugin, vscode, vsc

    An Old Hope Theme     (theme, 推荐,且推荐它的 classic theme,安装后在颜色选项里选择,该插件的定制见文末) Cobalt2     (theme) Drac ...

  8. pythonunittest接口测试_基于python+unittest +requests接口测试

    2019独角兽企业重金招聘Python工程师标准>>> 谈到接口测试,大家都不会感到陌生.接口测试的工具和实现方式也有很多,比如ant+jmeter+jemkins.postman. ...

  9. python unittest断言_python unittest之断言及示例

    assert.png 前言 python unintest单元测试框架提供了一整套内置的断言方法. 如果断言失败,则抛出一个AssertionError,并标识该测试为失败状态 如果异常,则当做错误来 ...

  10. Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例

    Python+Unittest+HTMLTestRunner测试报告-百度个人中心实例 环境配置:https://blog.csdn.net/sevensolo/article/details/100 ...

最新文章

  1. c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
  2. V8 Profiler 揭秘
  3. 出现could not find developer disk image解决办法和不受信任的开发者
  4. .Net Core应用框架Util介绍(三)
  5. python seaborn boxplot_python - 如何将文本框添加到Seaborn Boxplot? - 堆栈内存溢出
  6. python在windows系统中安装pandas,numpy
  7. SLAM GMapping(6)扫描匹配器
  8. python 写入excel_基于Python实现Excel的读写
  9. Eclipse常用开发插件(转)
  10. Word 里面如何设置多级标题
  11. android 发布最新系统更新包,安卓升级包(安卓补丁包更新)
  12. 施一公:优秀的科学家如何成长?
  13. 一周企业财报 | 汉高、中通、格林酒店、宜人金科、宝尊、维他奶等7家企业发布业绩...
  14. HTTP协议 (三) 代理
  15. c语言数码管显示小数点,8位数码管显示正整数和小数及解决鬼影问题
  16. 更改Linux系统的主机名(hostname)两种实用的方法
  17. 软考知识点---20标准化与法律法规
  18. STM32GPIO寄存器CRL、CRH、IDR、ODR、BSRR、BRR
  19. java加载tensorflow训练的PB模型记录
  20. vue项目 报sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR_

热门文章

  1. RedHat YUM configure
  2. C语言中“数组名”和“数组名”
  3. OpenGL动感模糊
  4. pat天梯赛L1-052. 2018我们要赢
  5. sudo apt-get update 出错 Updating from such a repository can‘t be done securely, and is therefore
  6. Android7.0 PowerManagerService亮灭屏分析(二)
  7. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
  8. redis 读取mysql数据类型_认识Redis与Redis的数据类型
  9. linux npm安装_手把手教你appium框架的搭建—linux
  10. nginx重新加载php,如何使用nginx启动、停止和重新加载