单元测试框架UnitTest
一 构成
主要流程:编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中。
1 TestCase
- 说明:一个TestCase的实例就是一条测试用例,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。主要用于验证某一个问题。
- 使用:(测试方法名称命名必须以test开头)
#导包 import unittest #新建测试类继承unittest.TestCase Class MethodName(unittest.TestCase): def setUp(self): pass def test_name(self): pass def test_password(self): pass def tearDown(self): pass
2 TestSuite & defaultTestLoader
2.1 TestSuite
- 说明:test suite是test case的合集,TestSuite中也可以嵌套TestSuite。
- 使用:
#进行实例化 suite=unittest.TestSuite() #添加用例到测试套件中 suite.addTest(ClassName("MethodName")) # (ClassName为类名;MethodName为方法名) #添加扩展 suite.addTest(unittest.makeSuite(ClassName)) #搜索指定ClassName内test开头的方法并添加到测试套件中
2.2 defaultTestLoader
- 说明:用来加载TestCase到TestSuite中,其中几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
- 使用:
test_dir = './' disconver = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') #(test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式 ) #运行 runner=unittest.TextTestRunner() runner.run(disconver)
2.3 区别
- TestSuite可以添加TestCase中所有test开头的方法,也可添加指定的test开头方法;
- defaultTestLoader搜索指定目录下指定开头的.py文件,并添加TestCase内所有test开头的方法,无法指定添加方法;
3 TextTestRunner
- 说明:执行测试用例,它可以执行case并提供结果给用户。其中的run(test)会执行TestSuite/TestCase中的run(result)方法。其次,它可提供图形界面、文本界面或者返回一个值表示测试结果。
- 使用
#1. 实例化 runner=unittest.TextTestRunner() #(runner:TextTestRunner实例化名称) #2. 执行: runner.run(suite) # (suite:为测试套件名称)
4 Fixture (继承unittest.TestCase)
- 说明:主要用于tests运行前需要做的准备工作以及结束后的清理工作,通过覆盖 TestCase的setUp()和tearDown()方法来实现。
- 使用:
#1. 初始化(搭建):实例化浏览器、浏览器最大化、隐式等待设置 def setUp(self) pass #2. 结束(销毁): 退出登录、关闭浏览器 def tearDown(self) pass
二 断言
1 基本布尔型断言:返回true或者false
| 方法 | 描述 |
|---|---|
| assertEqual(arg1,arg2,msg=None) | 验证arg1=arg2成立,若不等时则fail |
| assertNotEqual(arg1,arg2,msg=None) | 验证arg1=arg2不成立,若相等则fail |
| assertls(arg1,arg2,msg=None) | 验证arg1、arg2是同一个对象,若不是则fail |
| assertlsNot(arg1,arg2,msg=None) | 验证arg1、arg2不是同一个对象,若是则fail |
| assertTrue(expr,msg=None) | 验证expr是true,若为false,则fail |
| assertFalse(expr,msg=None) | 验证expr是false,若为true,则fail |
| assertlsNone(expr,msg=None) | 验证expr是None,若不是则fail |
| assertlsNotNone(expr,msg=None) | 验证expr不是None,若是则fail |
| assertln(arg1,arg2,msg=None) | 验证arg1是arg2的子串,若不是则fail |
| assertNotln(arg1,arg2,msg=None) | 验证arg1不是arg2的子串,若是则fail |
| assertlslnstance(obj,cls,msg=None) | 验证obj是cls的实例,若不是则fail |
| assertNotlslnstance(obj,cls,msg=None) | 验证obj不是cls的实例,若是则fail |
2 比较断言
| 方法 | 描述 |
|---|---|
| assertAlmostEqual(first,second,places=7,msg=None,delta=None) | 验证first约等于second,places表示精确到小数点后多少位,默认为7位 |
| assertNotAlmostEqual(first,second,places,msg,delta) | 验证first不约等于second,places表示精确到小数点后多少位,默认为7位,若delta指定了值,则first与second之间的差值必须小于等于delta; |
| assertGreater(first,second,msg=None) | 验证first大于second,否则fail |
| assertGreaterEqual(first,second,msg=None) | 验证first大于等于second,否则fail |
| assertLess(first,second,msg=None) | 验证first小于second,否则fail |
| assertLessEqual(first,second,msg=None) | 验证first小于等于second,否则fail |
| assertRegexpMatches(text,regexp,msg=None) | 验证正则表达式regexp搜索匹配的文本text,regexp常用re.search() |
| assertNotRegexpMatches(text,regexp,msg=None) | 验证正则表达式regexp搜索不匹配的文本text,regexp常用re.search() |
3 复杂断言
| 方法 | 描述 |
|---|---|
| assertListEqual(list1,list2,msg=None) | 验证列表list1与list2相等,若不等则fail,报错信息会返回具体不同的地方 |
| assertDictEqual(expected,actual,msg=None) | 验证字典expected与actual相等,若不等则fail,报错信息会返回具体不同的地方 |
| assertTupleEqual(tuple1,tuple2,msg=None) | 验证元组tuple1等于tuple2,若不等则fail,报错信息会返回具体不同的地方 |
| assertSetEqual(set1,set2,msg=None) | 验证集合set1与set2相等,若不等则fail,报错信息会返回具体不同的地方 |
三 使用
-
步骤一
导包:import unittest -
步骤二
编写测试类,继承unittest.TestCase父类class DefaultTestCase(unittest.TestCase): def test_default_widget_size(self): pass -
步骤三
编写测试用例,测试用例必须要已test开头,否则不能执行。
在编写时可使用TestCase.skipTest()或自带的装饰器函数跳过单个测试以及整个测试类,进行异常捕获;方法 描述 @unittest.skip(reason) 直接跳过被装饰的测试,reason是描述跳过的原因。 @unittest.skipIf(condition, reason) 如果if的条件成立则跳过测试。 @unittest.skipUnless(condition, reason) 除非条件为真,否则跳过测试。 @unittest.expectedFailure 标记测试为失败,如果在运行时失败,则不会在结果中统计。 exception unittest.SkipTest(reason) 跳过测试抛出的异常。 注意:如果测试被跳过,则不会执行setUp()和tearDown()方法;如果类被跳过,则不会执行setUpClass()和tearDownClass()方法;如果模块被跳过,则不会执行setUpModule()和tearDownModule()方法。
class DefaultTestCase(unittest.TestCase): def setUp(self): self.driver= Selenium.Foxfire() def test_size(self): self.assertEqual(200,200) @unittest.skipIf(mylib.__version__ < (1, 3),"not supported in this library version") def test_format(self): self.assertEqual(500,500) @unittest.skip("demonstrating skipping") def test_nothing(self): self.fail("shouldn't happen") @unittest.expectedFailure def test_fail(self): self.assertEqual(1, 0, "broken") def tearDown(self): self.driver.close() self.driver.quit() -
步骤四
运行unittest测试框架if __name__=="__main__": unittest.main() -
步骤五
配合HTMLTestRunner生成测试报告# 1 将HTMLTestRunner对应的文件下载后,复制到项目文件夹 # 2 导入HTMLTestRunner、unittest包 import unittest,time from CodeEdit.LX04.Tools.HTMLTestRunner import HTMLTestRunner # 3 使用discover加载要执行的用例 test_dir='.' discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py") # 4 设置报告生成的路径与文件名 if __name__=="__main__": file_name = file_dir+time.strftime("%Y-%m-%d %H-%M-%S")+"test_report.html" # 5 打开报告 with opem(file_name,'wb') as f: pass # 6 实例化HTMLTestRunner对象 runner = HTMLTestRunner(stream=f,title=u"自动化测试报告",description=u"4.1版本执行结果") # 7 执行 runner.run(discover)
本文深入解析了单元测试框架UnitTest的构成与使用流程,包括TestCase、TestSuite、TextTestRunner及Fixture的基本概念与应用技巧,同时提供了丰富的代码示例,帮助读者掌握如何编写、组织和运行测试用例。
703

被折叠的 条评论
为什么被折叠?



