范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一篇文章搞懂unittest单元测试框架

  每天进步一点点,关注我们哦,每天分享测试技术文章
  码同学公众号:自动化软件测试
  码同学抖音号:小码哥聊软件测试
  Python 2.1及以后的版本,将 unittest 作为一个标准模块放入Python开发包中。
  01   使用unittest编写测试用例
  规则:  import unittest  创建一个测试类,必须要继承unittest.TestCase类  创建一个测试方法,且方法要以"test" 开头  from calculator import Calculator     import unittest           class TestAdd(unittest.TestCase):         def test_add(self):             c =Calculator(3,5)             result = c.add()             self.assertEqual(result,8)           if __name__ =="__main__":         unittest.main() //通过main()方法来执行测试用例;按照测试类、方法的名称ASCII值大小的顺序执行用例
  unittest的执行结果 :  "."  表示测试用例执行通过  "F" 表示执行失败  "E"  表示执行错误  "s" 表示运行跳过
  02   三个重要概念
  Test Case  最小的测试单元,即 测试方法 。 unittest提供了TestCase基类,我们创建的测试类要继承该基类,它可以 用来创建新的测试用例 。
  Test Suite  测试用例、测试套件或两者的集合,用于 组装一组要运行的测试。
  使用TestSuite类来创建测试套件。
  Test Runner  Test Runner是一个组件, 用于协调测试的执行并向用户提供结果。  unittest提供了TextTestRunner类运行测试用例。
  03   测试用例执行顺序
  unittest默认按照 ASCII码 的顺序加载测试用例(包括测试目录和测试文件、测试类、测试方法),即 它并不是按照测试用例的创建顺序从上到下执行的。
  discover()   和 main()  方法的执行顺序是一样的。故想让某个测试文件先执行,可以在命名上加以控制。
  如何控制测试用例的执行顺序?  可以通过TestSuite类的 addTest()  方法按照一定的顺序来加载测试用例,这样想先被执行的用例就可以先加载。   from calculator import Calculator     import unittest           class TestAdd(unittest.TestCase):         def test_add(self):             c =Calculator(3,5)             result = c.add()             self.assertEqual(result,8)               def test_add_decimals(self):             c=Calculator(3.5,5.5)             result=c.add()             self.assertEqual(result,9)           class TestSub(unittest.TestCase):         def test_sub(self):             c =Calculator(5,1)             result = c.sub()             self.assertEqual(result,4)           if __name__ =="__main__":         #创建测试套件         suit = unittest.TestSuite()         suit.addTest(TestSub("test_sub")) //添加测试用例         suit.addTest(TestAdd("test_add_decimals"))               #创建测试运行器         runner = unittest.TextTestRunner()         runner.run(suit)
  04   执行多个测试用例
  unittest.defaultTestLoader.discover()  方法可以从多个文件中查找测试用例。
  该类根据各种标准加载测试用例,并将它们返回给测试套件
  discover  (  start_dir  ,  pattern  =" Test*.py  ",  top_level_dir  = None  )  start_dir: 待测试的模块名/测试用例目录;  discover()  方法会自动根据这个参数查找测试用例文件  pattern: 测试用例文件名的匹配原则  top_level_dir: 测试模块的顶级目录,如果没有顶级目录,默认为 None  import unittest     test_dir="Test" //文件目录           suits =unittest.defaultTestLoader.discover(test_dir, pattern="Test*.py")           if __name__=="__main__":         runner = unittest.TextTestRunner()         runner.run(suits)
  如果想让 discover()  查找子目录下的测试文件,得将子目录标记为一个python模块(子目录下放__init__.py  文件)
  05   跳过测试和预期失败
  import  unittest     class MyTest(unittest.TestCase):               @unittest.skip("跳过这条用例")         def test_skip(self):             print("aaa")               @unittest.skipIf(3>2,"当条件为真时跳过测试")         def test_skip_if(self):             print("bbb")               @unittest.skipUnless(3>2,"当条件为假时跳过测试")         def test_skip_unless(self):             print("ccc")           // 不论执行结果是什么,都将测试标记为失败         @unittest.expectedFailure          def test_fail(self):             print("ddd")           if __name__=="__main__":         unittest.main()
  执行结果:  E:selenium> & "D:/Program Files/Python39/python.exe" e:/selenium/Test/unittest/skip_fail.py     ddd     ussccc     .     ----------------------------------------------------------------------     Ran 4 tests in 0.001s           FAILED (skipped=2, unexpected successes=1)
  以上四个装饰器同样适用于测试类。
  06   Setup和Teardown
  setUpModule/tearDownModule  在 整个模块 的开始与结束时被执行 setUpClass/ tearDownClass  在 测试类 的开始与结束时被执行 setUp/tearDown  在 测试用例 的开始与结束时被执行 import unittest     def setUpModule():         print(" Module start .....")           def tearDownModule():         print(" Module end ...")           class MyTest(unittest.TestCase):               @classmethod         def setUpClass(cls):             print("Class Start...")                  @classmethod         def tearDownClass(cls):             print("Class end...")               def setUp(self):             print("test case start ...")               def tearDown(self):             print("test case end ...")               def testcase1(self):             print("this is first test case")                  def testcase2(self):             print("this is second test case")           if __name__ == "__main__":         unittest.main()
  执行结果如下:  E:selenium> & "D:/Program Files/Python39/python.exe" e:/selenium/Test/unittest/setup.py     Module start .....     Class Start...     test case start ...     this is first test case     test case end ...     .test case start ...     this is second test case     test case end ...     .Class end...      Module end ...        ----------------------------------------------------------------------     Ran 2 tests in 0.002s           OK
  免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦
  07    Web自动化测试
  import unittest     from selenium import webdriver     from time import sleep           class Baidu(unittest.TestCase):               @classmethod         def setUpClass(cls):             cls.driver = webdriver.Chrome()             cls.driver.implicitly_wait(5)             cls.driver.get("http://www.baidu.com")             cls.driver.maximize_window()         @classmethod         def tearDownClass(cls):             cls.driver.quit()               def search(self,text):             self.driver.find_element_by_id("kw").clear()         self.driver.find_element_by_id("kw").send_keys(text)             self.driver.find_element_by_id("su").click()             sleep(3)               def test_search_selenium(self):             search_key="selenium"             self.search(search_key)             self.assertEqual(self.driver.title,search_key+"_百度搜索")               def test_search_python(self):             search_key="python"             self.search(search_key)             self.assertEqual(self.driver.title,search_key+"_百度搜索")           if __name__ =="__main__":         unittest.main()
  08
  Parameterized   Parameterized 是python的一个参数化库,同时 支持unittest、pytest单元测试框架。 pip install parameterized parameterized.expand() 加载数据,列表中 每个元组是一条测试用例 import unittest from time import sleep from selenium import webdriver from parameterized import parameterized class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome() cls.driver.get("http://www.baidu.com") cls.driver.maximize_window @classmethod def tearDownClass(cls): cls.driver.quit() def search(self,search_key): self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys(search_key) self.driver.find_element_by_id("su").click() sleep(5) @parameterized.expand( [ ("case1","selenium"), ("case2","python") ] ) def test_search(self,name,search_key): self.search(search_key) self.assertEqual(self.driver.title,search_key+"_百度搜索") if __name__ == "__main__": unittest.main(verbosity=2)   09
  DDT   Data-Driven Tests 是 针对unittest单元测试框架 设计的扩展库。   安装:   pip install ddt   导入:   from ddt import ddt, data, file_data,unpack   使用规则: 必须用 @ddt 装饰测试类 数据有不同形式的参数化,如下方的元组、列表、字典类型 @data ( 数据列表/元组/字典,字典的key和方法中的形参名称保持一致) @unpack 装饰测试方法 import unittest from time import sleep from selenium import webdriver from ddt import ddt,data,file_data,unpack @ddt class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome() cls.driver.get("http://www.baidu.com") cls.driver.maximize_window @classmethod def tearDownClass(cls): cls.driver.quit() def search(self,search_key): self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys(search_key) self.driver.find_element_by_id("su").click() sleep(5) @data( ("case1","selenium"), ("case2","python") ) @unpack def test_search1(self,name,search_key): print("第一组测试用例:",name) self.search(search_key) self.assertEqual(self.driver.title,search_key+"_百度搜索") @data( ["case1","selenium"], ["case2","python"] ) @unpack def test_search2(self,name,search_key): print("第二组测试用例:",name) self.search(search_key) self.assertEqual(self.driver.title,search_key+"_百度搜索") @data( {"key":"selenium"}, {"key":"python"} ) @unpack def test_search3(self,key): print("第三组测试用例:",key) self.search(key) self.assertEqual(self.driver.title,key+"_百度搜索") if __name__ == "__main__": unittest.main(verbosity=2)   执行报错如下时,是 因为文件名也为ddt: PS E:selenium> & "D:/Program Files/Python39/python.exe" e:/selenium/Test/unittest/ddt.py Traceback (most recent call last): File "e:seleniumTestunittestddt.py", line 4, in from ddt import ddt,data,file_data,unpack File "e:seleniumTestunittestddt.py", line 4, in from ddt import ddt,data,file_data,unpack ImportError: cannot import name "ddt" from partially initialized module "ddt" (most likely due to a circular import) (e:seleniumTestunittestddt.py)   10
  数据文件的参数化   @file_data() 装饰器中内容为文件名称。支持 json格式 和yaml格式 。 import unittest from time import sleep from selenium import webdriver from ddt import ddt,data,file_data,unpack @ddt class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome() cls.driver.get("http://www.baidu.com") cls.driver.maximize_window @classmethod def tearDownClass(cls): cls.driver.quit() def search(self,search_key): self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys(search_key) self.driver.find_element_by_id("su").click() sleep(5) @file_data("ddt_data.json") @unpack def test_search1(self,search_key): print("第一组测试用例:",search_key) self.search(search_key) self.assertEqual(self.driver.title,search_key+"_百度搜索") @file_data("ddt_data_yml.yaml") @unpack def test_search2(self,case): search_key=case[0]["search_key"] print("第二组测试用例:",search_key) self.search(search_key) self.assertEqual(self.driver.title,search_key+"_百度搜索") if __name__ == "__main__": unittest.main(verbosity=2) ddt_data.json { "case1": {"search_key": "python"}, "case2": {"search_key": "ddt"} } ddt_data_yml.yaml case1: - search_key: "python" case2: - search_key: "ddt"   END   免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

在河南想做视频业务没有广播电视节目制作经营许可证属于违法经营如果想要办理广播电视节目制作经营许可证就要先知道在什么部门审批,广播电视节目制作经营许可证则是在文化广电和旅游局审批,一般都在本省的政务服务中心办公。必须现场办理吗?办理形式窗口办上海ICP怎么申请?为什么说上海ICP很难申请?上海的ICP许可证很多网友都说非常难申请!今天小尼给大家分析一下在上海办理ICP许可证的优势劣势。ICP许可证全称又叫增值电信业务经营许可证仅限互联网信息服务,审批部门在上海市通信上海ICP许可证怎么办理?有什么要求?没有icp许可证会被处罚吗?上海超一线城市,也是互联网企业的聚集地,大大小小的公司数不胜数,上海也是互联网监督最严格的一个城市。很多互联网创业公司因为没有办理增值电信业务经营许可证从而进行违规开展电信业务经营sp许可证你知道什么业务需要吗?花费充值与运营商签合同都需要SP许可证是第二类增值电信业务经营许可证的一种不含互联网信息服务,大家可以看出不含互联网只是针对手机移动端业务。今天小尼给各位老板聊聊sp许可证的作用,目前互联网公司基本上都有属于申请山东ICP许可证被退回五次,什么原因导致这么难申请?山东省申请ICP许可证有多难,昨天一位山东的网友私信我,该如何申请ICP许可证,为什么总是被退回?先上图,有图有真相上面大家可以看到,这位网友从三月份开始自己申请,一次一次被退回,增值电信业务CND许可证怎么办理?有多重要?看看无证经营的后果内容分发网络CDN许可证是第一类增值电信业务,很多不做这方便业务的朋友不知道这是个什么玩意,白话讲就是将内容分发到快速稳定的缓存服务器上,提高用户的访问响应速度。那么哪些业务需要用ICP许可证线上营业执照,不懂得赶紧来看看,别等罚款来找你互联网创业的老板们注意了,这篇文章可能改变你对线上互联网资质的认知!一直以来都人问我怎么去申请ICP许可证,还有呢他做的项目到底需不需要ICP许可证!那么今天呢小尼给大家简单讲一下海南省办理食品经营许可证需要什么材料,没有实际经营地址怎么办食品经营许可证只要是做食品餐饮的老板都不陌生,食品经营许可证的经营范围也有很多比如,预包装散装热食冷冻等。办理过食品经营许可证的老板都知道申请最重要的是经营地址,当然如果是做餐饮的小说公众号网站必备的两个资质网络文化经营许可证与ICP许可证做小说行业公众号的可以说是门槛低赚钱快的一个渠道,不知道大家是否在公众号上看小说看着看着就必须付费才能观看?小说行业公众号开通广告收费等功能就需要提供网络文化经营许可证大家可以看到网站底部不放备案链接也被罚?图片上大家可以看到,网站上只是因为没有放ICP备案的链接,导致罚款五千元。在这里想跟大家说,ICP备案是免费的而且特别简单,既然备案都下来了,咱们也就别手懒了一定要及时把备案号放在国产剧烂俗套路影视剧就是全中国最封建的地方都是套路(本文系2021年4月25日华东师范大学教授作家影评人毛尖在网络访谈节目四味毒叔里的演说内容)每次,当一个人想金盆洗手时,就会有坏人来横刀。笑傲江湖里,衡山派刘正风说完从此
英伟达官方显卡天梯图引争议,RTX3060和RTX2070谁更厉害?今年4月12号,英伟达官方发布了一段视频,展示了GTX16RTX20以及RTX30系列桌面显卡的性能排序。再看极速空间显卡天梯图V6。32会发现如下问题1RTX3050和GTX16雷军继续出击,12512G果断降5000!折叠屏不再高贵对于大部分人来说,现在还是不喜欢接受折叠屏这种产品,主要还是两方面原因,一是因为不具备通用实用性,二是因为成本高,购机价格太贵,不值得。但对于真正有需求的用户来说,折叠屏这种产品实被盛赞之下的红米K50,有哪些不足?如果说联发科天玑8100引发了前所未有热度的话,那么红米K50的上市无疑是进一步推动了联发科天玑8100的热度。从官方宣传的文案来看,红米K50确实亮点很多,CPU性能看齐骁龙88全球可穿戴设备出货量排行公布随着现在手机的快速发展,现在智能设备也开始出现在人们的生活当中,其中蓝牙耳机和智能手表是人们购买量最多的产品。最近有权威机构公布了2021年,智能可穿戴数据的出货量,根据权威机构公想买五年流畅不卡又便宜的手机,这四款可以,只因处理器给力很多人对手机的需求没有那么高,流畅不卡多用几年不能太贵,这就是它们核心的三个需求,那么在如今的手机市场,能够满足这三个条件的产品有吗?答案当然是有的,譬如下面的四款产品。一K40S全球头号资管巨头贝莱德调研比亚迪全球头号资管巨头贝莱德调研比亚迪财联社4月14日电,比亚迪13日晚间披露的投资者关系活动记录表显示,贝莱德4月12日通过电话会议方式调研比亚迪。贝莱德关注的问题主要集中于比亚迪DMSmartisanOS宣布回归,这一次不是手机,老罗要回来了?今天,SmartisanOS团队在社交软件发布长文朋友们,好久不见。官宣SmartisanOS即将回归。不过这次搭载SmartisanOS的产品不是手机,而是某合作伙伴的大屏硬件设一次SQL查询优化原理分析900W数据,从17s到300ms来源jianshu。comp0768ebc4e28d有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16s938ms(ex中兴Axon40正面照公开,微曲全面屏屏下摄像头4月15日消息中兴手机宣布,中兴Axon40系列成为神舟十三归航新华网现场报道独家官方指定用机,宣传海报中,中兴Axon40正面照公开。海报显示,中兴Axon40仍然是屏下前置摄像特朗普若马斯克恢复他的账户也很可能不会回去欧联网4月15日电,据欧联通讯社报道,当地时间4月14日,特斯拉首席执行官伊隆马斯克(ElonMusk)对推特(Twitter)的收购引发了人们的猜测,即如果他成功收购这家社交媒体华为Mate50Pro渲染图环绕一体屏6G网络,弯道超车成功了?华为最近的消息还是挺多的,并且有不少是利好的消息,比如华为申请了不少的专利也都被曝光了。除了相关的专利被曝光之外,华为Mate50Pro的相关消息也被媒体透露,尤其是发布的时间和一