python unittest单元测试

单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情。虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元。所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的“家伙”。所以工作会在轻松中开始,并且很快将会结束,因为你已经知道很多信息了。

单元测试自然是对程序中最小的可测试模块--函数来进行测试;因为单元测试的对象是函数,也就是说你得被测试对象一定要有输出结果,哪怕就是异常输出,也得有输出,以便单元测试模块能够捕获返回值,并且与预期值进行比较,从而得出测试通过与否。

单元测试的加载方式有2种:一种是通过unittest.main()来启动单元测试的测试模块;一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例,下面分别列出了2种方法的使用。

1.1 测试模块中的函数:

被测模块:

[python] view plaincopy

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. def sum( x, y):
  4. return x+y
  5. def sub( x, y):
  6. return x-y

单元测试模块:

[python] view plaincopy

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. import unittest
  4. import myclass
  5. class mytest(unittest.TestCase):
  6. ##初始化工作
  7. def setUp(self):
  8. pass
  9. #退出清理工作
  10. def tearDown(self):
  11. pass
  12. #具体的测试用例,一定要以test开头
  13. def testsum(self):
  14. self.assertEqual(myclass.sum(1, 2), 2, ‘test sum fail‘)
  15. def testsub(self):
  16. self.assertEqual(myclass.sub(2, 1), 1, ‘test sub fail‘)
  17. if __name__ ==‘__main__‘:
  18. unittest.main()

测试结果:【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】

[python] view plaincopy

  1. .F
  2. ======================================================================
  3. FAIL: testsum (__main__.mytest)
  4. ----------------------------------------------------------------------
  5. Traceback (most recent call last):
  6. File "C:\Users\xiaowu\workspace\mypython\unitTest.py", line 19, in testsum
  7. self.assertEqual(myclass.sum(1, 2), 2, ‘test sum fail‘)
  8. AssertionError: test sum fail
  9. ----------------------------------------------------------------------
  10. Ran 2 tests in 0.001s
  11. FAILED (failures=1)

1.2 测试模块类中的函数:

被测模块:

[python] view plaincopy

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. class myclass:
  4. def __init__(self):
  5. pass
  6. def sum(self, x, y):
  7. return x+y
  8. def sub(self, x, y):
  9. return x-y

单元测试模块:

[python] view plaincopy

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. import unittest
  4. import myclass
  5. class mytest(unittest.TestCase):
  6. ##初始化工作
  7. def setUp(self):
  8. self.tclass = myclass.myclass()   ##实例化了被测试模块中的类
  9. #退出清理工作
  10. def tearDown(self):
  11. pass
  12. #具体的测试用例,一定要以test开头
  13. def testsum(self):
  14. self.assertEqual(self.tclass.sum(1, 2), 3)
  15. if __name__ ==‘__main__‘:
  16. unittest.main()

运行结果:

[python] view plaincopy

  1. .
  2. ----------------------------------------------------------------------
  3. Ran 1 test in 0.000s
  4. OK

这种方式执行单个测试文件时使用-v参数可以获得更多的测试结果信息。如:mytest.py -v

2 加载测试套件

好吧,在运用测试套件进行单元测试之前,我想还是稍微研究一下unittest模块的内容有哪些,其大概的运行方式是什么样的。而后在给出根据各种情况如何制定单元测试套件。

首先,自然是查看unittest模块有哪些成员啦!

[python] view plaincopy

  1. >>import unittest
  2. >>dir(unittest)
  3. [‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘, ‘Tes
  4. tSuite‘, ‘TextTestRunner‘, ‘_CmpToKey‘, ‘_TextTestResult‘, ‘_WritelnDecorator‘,
  5. ‘__all__‘, ‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__email__‘, ‘__file__‘, ‘__
  6. metaclass__‘, ‘__name__‘, ‘__package__‘, ‘__unittest‘, ‘__version__‘, ‘_makeLoad
  7. er‘, ‘_strclass‘, ‘defaultTestLoader‘, ‘findTestCases‘, ‘getTestCaseNames‘, ‘mai
  8. n‘, ‘makeSuite‘, ‘os‘, ‘sys‘, ‘time‘, ‘traceback‘, ‘types‘]

可以看到其自身的成员也不是很多,大概包括有:
[‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘,
 ‘TestSuite‘,‘TextTestRunner‘, ‘_CmpToKey‘, ‘_TextTestResult‘, ‘_WritelnDecorator‘,
 ‘defaultTestLoader‘,‘findTestCases‘, ‘getTestCaseNames‘, ‘main‘, ‘makeSuite‘]
 
 好吧,我们大概看看具体都是干什么的

[python] view plaincopy

  1. >>memblist = [‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘,\
  2. ‘TestSuite‘,‘TextTestRunner‘, ‘defaultTestLoader‘,‘findTestCases‘, ‘getTestCaseNames‘, \
  3. ‘main‘, ‘makeSuite‘]
  4. >>for memb in memblist:
  5. ..  cur = getattr(unittest, memb)
  6. ..  print help(cur)

‘FunctionTestCase‘:函数测试用例,即给一个函数作为参数,返回一个testcase实例,可选参数有set-up,tear-down方法
 ‘TestCase‘:所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例
 ‘TestLoader‘:测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件
 loadTestsFromModule(self, module)--根据给定的模块实例来获取测试用例套件
 loadTestsFromName(self, name, module=None)
 --根据给定的字符串来获取测试用例套件,字符串可以是模块名,测试类名,测试类中的测试方法名,或者一个可调用的是实例对象
 这个实例对象返回一个测试用例或一个测试套件
 loadTestsFromNames(self, names, module=None) --和上面功能相同,只不过接受的是字符串列表
 loadTestsFromTestCase(self, testCaseClass)--根据给定的测试类,获取其中的所有测试方法,并返回一个测试套件
‘TestProgram‘:命令行进行单元测试的调用方法,作用是执行一个测试用例。其实unittest.main()方法执行的就是这个命令,
而这个类实例时默认加载当前执行的作为测试对象,
原型为 __init__(self, module=‘__main__‘, defaultTest=None, argv=None, testRunner=xx, testLoader=xx)
其中module=‘__main__‘就是默认加载自身
‘TestResult‘:测试用例的结果保存实例,通常有测试框架调用
 ‘TestSuite‘:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给testRunner进行测试执行
 ‘TextTestRunner‘:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。显示测试名称,即完成的测试结果,其过同执行单元测试脚本时添加-v参数
 ‘defaultTestLoader‘:其实就是TestLoader
 ‘findTestCases‘, ‘getTestCaseNames‘:这个2个就不用解释了
 ‘main‘: 其实就是TestProgram
 ‘makeSuite‘:通常是由单元测试框架调用的,用于生产testsuite对象的实例
 
 至此,我们知道了。其实整个单元测试框架的逻辑出来了。分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,
 然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。
 而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
 在第二步中把自身模块中的所有测试类中中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。
 
 最后给出一个完整的单元测试组织代码,把该代码放到单元测试用例文件的同一个目录后执行该脚本,即可执行所有的测试用例文件。
 【测试用例文件必须为test开头,如:testxxx.py, 当然这个文件本身是一个单元测试的文件】

[python] view plaincopy

    1. #!/usr/bin/env python
    2. #encoding: utf-8
    3. #该代码源自深入python
    4. import unittest
    5. import myclass
    6. import re
    7. import os
    8. import sys
    9. def testAllinCurrent():
    10. path = os.path.abspath(os.path.dirname(sys.argv[0]))
    11. files = os.listdir(path)
    12. test = re.compile("test\.py{1}quot;, re.IGNORECASE)
    13. files = filter(test.search, files)
    14. filenameToModuleName = lambda f: os.path.splitext(f)[0]
    15. moduleNames = map(filenameToModuleName, files)
    16. modules = map(__import__, moduleNames)
    17. load = unittest.defaultTestLoader.loadTestsFromModule
    18. return unittest.TestSuite(map(load, modules))
    19. if __name__ == "__main__":
    20. unittest.main(defaultTest="regressionTest")
时间: 2024-10-25 15:14:09

python unittest单元测试的相关文章

26 Python - unittest单元测试

unittest单元测试 01单元测试概述 02 测试代码组织 略 03常见的断言方法 04类与测试装置 定义一个计算器类 测试类 改进后的测试类 测试类经常使用setup方法和tearDown方法一个用于测试前使用,一个用于测试后使用 如setUp可以用于测试类的实例化,tearDown可以用于关闭文件或数据库的内容 原文地址:https://www.cnblogs.com/yijiexi/p/11140588.html

python - unittest 单元测试学习

单元测试 单元测试是用来对一个模块.一个函数或者一个类进行正确性检验的测试工作 比如对Python中的abs 的测试 输入正数: 比如 1, 2, 3, 返回值不变 输入负数: 比如 -1, -2, -3, 返回值是本身取反 输入0: 比如 0, 返回值0 把上面的测试用例放到一个测试模块里,就是一个完整的单元测试. 如果单元测试通过,说明我们测试的这个函数能够正常工作.如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过. 单元测试通过后有什么意义呢?

python - unittest - 单元测试

# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_unittest.py@ide: PyCharm Community Edition@time: 2018-11-24 09:00@blog: https://www.cnblogs.com/gotesting/ ''' ''' 单元测试框架:unittest . pytest 单元测试谁做的? --- 开发单元测试是干嘛? --- 对单个模块进行的测试,直到没

python unittest单元测试框架-2discover

基于TestLoader提供的discover方法实现用例执行 当用例达达到数十条后,在runtest.py文件中通过addTest()添加/删除测试用例就非常麻烦.此时可以使用discover方法找到目录下所有测试模块,并可以递归查到子目录下的测试模块,只有匹配到文件名才能被加载.如果启动的不是顶层目录,那么顶层目录必须单独指定. discover(start_dir, pattern="test*.py", top_level_dir=None) #start_dir:要测试的模块

Python+Selenium ----unittest单元测试框架

unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做"PyUnit",是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java还有一个很好用的单元测试框架叫TestNG,本系列只学习Python,所以只需要unittest是Python里的一个单元测试框架就可以了.       unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是test,也就是一个测试用例.要了解

python unittest 测试所有相关单元测试

python unittest 测试所有相关单元测试 python -m unittest discover project_directory "ut_*.py" 原文地址:https://www.cnblogs.com/bingwork/p/9714318.html

Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去掉验证码 1.手动在请求中添加cookies信息 1 url = "http://www.baidu.com" 2 driver = webdriver.Firefox() 3 driver.get(url) 4 time.sleep(3) 5 #添加cookies的方式 6 7 c1 =

python之unittest单元测试

# unittest单元测试 import unittest from class_demo import Car class TestCar(unittest.TestCase): '''测试Car类''' def setUp(self): '''初始化数据''' self.car_obj = Car('Audi', 'A6', 2017) def test_set_odometer(self): '''测试Car类的set_odometer方法''' self.car_obj.set_odo

Python基础入门-unittest单元测试框架

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试. 目录 一.unittest模块的各个属性说明 二.使用unittest框架编写测试用例思路 三.使用unittest框架编写测试用例实例 一.unittest模块的各个属性说明 先来聊一聊unittest模块的各个属性,所谓知己知