我们在时间工作中,会将整个项目的代码分别放置多个模块中去编写。方便后期项目维护,比如,我们的web项目可能有多个IP地址,每个IP地址代表不同的测试环境。测试环境与Bat环境或者验收环境等。这就需要我们频繁更换测试地址 ;或者我们需要验证web 项目在不同的浏览器上面的兼容性,需要我们更换浏览器测试,这样我们必须切换代码中的浏览器驱动。
我们可以将公共代码放在另一个.py文件中,就像这样:
我们将测试固件分离出去,这样方便我们在公共模块下维护测试需要的初始化环境,方便切换浏览器或者更改地址
1 import unittest #导入unittest库 2 from selenium import webdriver #导入selenium中的webdriver浏览器驱动 3 import time as t 4 5 6 class public_baidu(unittest.TestCase): #我们写的测试固件类,里面有初始化方法setup()和tearDown() 7 @classmethod # 使用 @classmethod 装饰器函数,把方法变成类方法,可以直接调用方法,类本身就不在需要实例化类对象就可以调用此方法 8 def setUp(cls): 9 cls.driver = webdriver.Chrome() #比如切换其他浏览器,我们都可以在这里更改 10 cls.driver.maximize_window() 11 cls.driver.implicitly_wait(15) 12 cls.driver.get(r'http://www.baidu.com') #比如我们的测试地址有好几套,我们可以直接在这里跟换地址 13 t.sleep(2) 14 15 @classmethod 16 def tearDown(cls): 17 cls.driver.quit()
name我们在另一个.py模块中肯定是主要存放测试案例,我们看下代码:
1 import unittest #导入unittest 2 from bokeyuan.bokeyuan_public import * #注意这是我们自己创建的模块 .py文件,该模有公共代码 3 4 class page_baidu_sousuo(public_baidu): #定义一个类,并继承我们写的公共模块文件里面的public_baidu类 5 6 '''以下案例是测试百度首页链接''' 7 def test_baidu_001(self): #案例001 测试进入百度新闻界面 8 '''测试百度首新闻链接''' 9 self.driver.find_element_by_link_text('新闻').click() #点击百度页面,超链接【新闻】两个字 10 t.sleep(2) #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的 11 self.driver.back() 12 13
14 def test_baidu_002(self): #案例002 测试进入百度地图界面 15 '''测试百度首地图链接''' 16 self.driver.find_element_by_link_text('地图').click() ##点击百度页面,超链接【地图】两个字 17 t.sleep(2) 18 self.driver.back() 19 20 '''以下案例是测试百度首页搜索功能''' 21 def test_baidu_003(self): 22 '''测试百度首页搜索功能''' 23 self.driver.find_element_by_id('kw').send_keys('你好朋友') 24 t.sleep(2) 25 26 @staticmethod #静态方法分离测试套件,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。类.方法().看最后的代码调用:page_baidu_lianjie.suite() 27 def suite(): 28 suite = unittest.TestSuite(unittest.makeSuite(page_baidu_sousuo)) #将测试套件单独分离出,封装成方法,直接调用,以后就不用再每次都写 29 return suite #将测试套件返回,如果不写return返回,那么将不会将内容返回给调用方下面的run() 30 31 if __name__ =='__main__': 32 unittest.TextTestRunner(verbosity=2).run(page_baidu_sousuo.suite()) #run()接收封装的测试套件suite()方法的返回参数,进行测试套件的执行载入,然后生成报告
这样我们就可以试试两个文件维护后进行执行了:
比如今天发现有一条案例最近需求被推翻了,我们在需求没有拍板的时候,我们可以跳过该条案例的执行,注释代码是一种方法,但是并不是很友好,我们看下unittest提供的skip()方法 :
注意,如果你单独复制代码是不行的,需要把案例一里面的公共模块也赋值走哦!!!
1 import unittest #导入unittest 2 from bokeyuan.bokeyuan_public import * #注意这是我们自己创建的模块 .py文件,该模有公共代码 3 4 class page_baidu_sousuo(public_baidu): #定义一个类,并继承我们写的公共模块文件里面的public_baidu类 5 6 '''以下案例是测试百度首页链接''' 7 def test_baidu_001(self): #案例001 测试进入百度新闻界面 8 '''测试百度首新闻链接''' 9 self.driver.find_element_by_link_text('新闻').click() #点击百度页面,超链接【新闻】两个字 10 t.sleep(2) #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的 11 self.driver.back() 12 13 @unittest.skip('地图链接,正在更改昨天的bug,今天先不执行') #用unittest提供的skip()方法,跳过测试案例,执行下一条案例 14 def test_baidu_002(self): #案例002 测试进入百度地图界面 15 '''测试百度首地图链接''' 16 self.driver.find_element_by_link_text('地图').click() ##点击百度页面,超链接【地图】两个字 17 t.sleep(2) 18 self.driver.back() 19 20 '''以下案例是测试百度首页搜索功能''' 21 def test_baidu_003(self): 22 '''测试百度首页搜索功能''' 23 self.driver.find_element_by_id('kw').send_keys('你好朋友') 24 t.sleep(2) 25 26 @staticmethod #静态方法分离测试套件,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。类.方法().看最后的代码调用:page_baidu_lianjie.suite() 27 def suite(): 28 suite = unittest.TestSuite(unittest.makeSuite(page_baidu_sousuo)) #将测试套件单独分离出,封装成方法,直接调用,以后就不用再每次都写 29 return suite #将测试套件返回,如果不写return返回,那么将不会将内容返回给调用方下面的run() 30 31 if __name__ =='__main__': 32 unittest.TextTestRunner(verbosity=2).run(page_baidu_sousuo.suite()) #run()接收封装的测试套件suite()方法的返回参数,进行测试套件的执行载入,然后生成报告
今天的东西不太多,明天开始笔记断言的部分。
总结今天的知识:
1、 分离测试固件,将公共部分放在另一.py文件模块中,方便后期维护
2、 利用unittest中的skip()方法忽略不需要执行的案例
来自子努力学习的新手,有错误的地方,请帮忙指点。有不理解的小伙伴,可以直接留言哦。一起学习,希望我的笔记对你也有帮助~