unittest框架概要
unittest是Python语言自带的单元测试框架,原名PyUnit.
认识unittest
在unittest框架中有4个重要概念:test fixture、test case、test suite和test runner。详情:
test fixture:测试用例环境的搭建和销毁,通过覆盖TestCase的setUp()和tearDown()方法实现,非unittest属性。
unittest.TestCase:TestCase类,所有测试用例类继承的父类。
unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
unittest.TextTestRunner():unittest框架的TextTextRunner()类,通过该类的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
unittest.defaultTestLoader(): unittest框架的defaultTestLoader()类,通过该类的discover()方法找到指定目录下的所以测试模块,匹配到的文件均可以被加载。
unittest.main():可以方便的将一个单元测试模块变为可直接运行的测试脚本,main() 方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。
unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): expectedFailure()测试标记为失败。
1 #widget.py 将要被测试的类 2 class Widget: 3 def __init__(self, size = (40, 40)): 4 self._size = size 5 def getSize(self): 6 return self._size 7 def resize(self, width, height): 8 if width 0 or height < 0: 9 raise ValueError, "illegal size" 10 self._size = (width, height)
1 from widget import Widget 2 import unittest 3 # 执行测试的类 4 class WidgetTestCase(unittest.TestCase): 5 def setUp(self): 6 self.widget = Widget() 7 def tearDown(self): 8 self.widget = None 9 def testSize(self): 10 self.assertEqual(self.widget.getSize(), (40, 40)) 11 def testResize(self): 12 self.widget.resize(100, 100) 13 self.assertEqual(self.widget.getSize(), (100, 100)) 14 15 if __name__ == "__main__": 16 # 构造测试集 17 suite = unittest.TestSuite() 18 suite.addTest(WidgetTestCase("testSize")) 19 suite.addTest(WidgetTestCase("testResize")) 20 21 # 执行测试 22 runner = unittest.TextTestRunner() 23 runner.run(suite)
unittest的web应用
python没有专门的自动化测试框架,故应用unittest单元测试框架进行web自动化。
import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://www.python.org") self.assertIn("Python", driver.title) elem = driver.find_element_by_name("q") elem.send_keys("python") elem.send_keys(Keys.RETURN) #类似键盘enter操作 assert "No results found." not in driver.page_source def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()
总结unittest框架好处:
1.提供用例组织和执行,简单说就是规定了测试用例的执行顺序
2.提供丰富的比较方法,将实际结果和预期结果进行比较断言
3.提供丰富的日志,用例执行结果都有一个很好的记录