自动化测试--UnitTest框架

本文深入解析了单元测试框架UnitTest的构成与使用流程,包括TestCase、TestSuite、TextTestRunner及Fixture的基本概念与应用技巧,同时提供了丰富的代码示例,帮助读者掌握如何编写、组织和运行测试用例。

单元测试框架UnitTest

一 构成

主要流程:编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中。

1 TestCase

  1. 说明:一个TestCase的实例就是一条测试用例,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。主要用于验证某一个问题。
  2. 使用:(测试方法名称命名必须以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
  1. 说明:test suite是test case的合集,TestSuite中也可以嵌套TestSuite。
  2. 使用:
    #进行实例化
    suite=unittest.TestSuite()   
    #添加用例到测试套件中
    suite.addTest(ClassName("MethodName"))   # (ClassName为类名;MethodName为方法名)
    #添加扩展
    suite.addTest(unittest.makeSuite(ClassName))  #搜索指定ClassName内test开头的方法并添加到测试套件中
    
2.2 defaultTestLoader
  1. 说明:用来加载TestCase到TestSuite中,其中几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
  2. 使用:
    test_dir = './'
    disconver = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')  #(test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式 )
    #运行
    runner=unittest.TextTestRunner()
    runner.run(disconver)
    
2.3 区别
  1. TestSuite可以添加TestCase中所有test开头的方法,也可添加指定的test开头方法;
  2. defaultTestLoader搜索指定目录下指定开头的.py文件,并添加TestCase内所有test开头的方法,无法指定添加方法;

3 TextTestRunner

  1. 说明:执行测试用例,它可以执行case并提供结果给用户。其中的run(test)会执行TestSuite/TestCase中的run(result)方法。其次,它可提供图形界面、文本界面或者返回一个值表示测试结果。
  2. 使用
    #1. 实例化 
    runner=unittest.TextTestRunner()   #(runner:TextTestRunner实例化名称)
    #2. 执行: 
    runner.run(suite)      # (suite:为测试套件名称)
    

4 Fixture (继承unittest.TestCase)

  1. 说明:主要用于tests运行前需要做的准备工作以及结束后的清理工作,通过覆盖 TestCase的setUp()和tearDown()方法来实现。
  2. 使用:
    #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)
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值