1)HTML报告的生成:测试报告最好要生成在一个特殊的目录下面
1)在python的lib文件下面添加文件是HTMLTestRunner.py文件:
self就是当前类中的实例
2)HTML报告的生成步骤:
2.1)解决HTML文件存放的问题:创建一个文件夹
2.2)HTML报告命名问题,如何进行动态命名,每一次生成的文件名称如何不一致?可以用当前的时间来进行命名?
import HTMLTestRunner import result from selenium import webdriver import time import unittest import sys import os class TestBaiDuThree(unittest.TestCase): def setUp(self): print("开始执行自动化测试") self.driver=webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe") self.baseurl="http://www.baidu.com" self.driver.maximize_window() time.sleep(3) def tearDown(self): print("自动化测试执行完毕") self.driver.quit() def testXinWen(self): self.driver.get(self.baseurl) text=self.driver.find_element_by_link_text("新闻") text.click() time.sleep(3) # 在这里面使用断言 print(self.driver.title) if __name__ == '__main__': #1.创建文件夹 #获取项目所在的工程目录,HTML报告不能和py文件混合在一起 curpath=sys.path[0] if not os.path.exists( curpath+"/resultreport/"): os.makedirs(curpath+"/resultreport/") # 2.文件的创建,不能让名称重复,时间,时,分,秒名称绝对不会重复,防止文件名重复把前一个文件名进行覆盖 now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time())) # 打印相关信息 str="curpath:"+curpath+"now:"+now+"time.time():"+time.time()+"/n"+"time.localtime(time.time())"+time.localtime(time.time()) print(str) filename=curpath+'/resultreport/'+now+"resultport.html" with open(filename,'wb') as fp: runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"测试报告",description=u"用例执行情况",verbosity=2) suite = result.createsuite(); runner.run(suite)
createsuite()方法在这里:
import unittest def createsuite(): discover=unittest.defaultTestLoader.discover("./TestCase",pattern="TestBaiDu*.py",top_level_dir=None) return discover
2)异常捕捉和错误截图:
因为用例不可能每一次运行都会成功,肯定运行有不成功的时候,如果可以捕捉到错误,并且把错误截图给保存下来,这是一个非常棒的功能,也会给我们定位问题带来方便
目的:自动保存错误现场
使用方法:依靠get_screenshot_as_file(文件生成的路径+文件后缀名)就可以实现截图
下面我们来写一个方法来进行演示一下:哪一个函数调用这个方法,就会产生错误截图
import unittest from selenium import webdriver import time import os import sys def GetErrorImage(driver,file_name): print(os.path) print(sys.path[0]) #创建保存错误截图的目录 if not os.path.exists("./image"): os.makedirs('./image/') #解决可能会冲突的命名方式 now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time())) #正式进行错误截图 driver.get_screenshot_as_file("./image/"+now+"-"+file_name) time.sleep(1) def Test_Baidu(): driver=webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe") driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("王广元") time.sleep(3) driver.find_element_by_id("su").click() time.sleep(3) try: driver.assertNotEqual(driver.title,"百度一下你不知道",msg="不一致") except: GetErrorImage(driver, "hello.jpg") driver.quit() if __name__=="__main__": Test_Baidu()
数据驱动:
用数据驱动去驱动一个测试用例去不断的执行直到所有的测试数据都执行完成
比如说我要进行测试一个软件的登录功能的测试步骤:
1)输入账户
2)输入密码
3)点击登录
输入正确账号错误密码 登陆失败
输入错误账号正确密码 登录失败
输入错误账号错误密码 登陆失败
输入正确账号正确密码 登陆成功
不存在的账号和密码
已经挂失的账户
已经注销的账户
用户密码输入为空
总结:这些用例的变化的只有数据,测试步骤都是一样的
1)安装数据驱动:
2)检查ddt是否安装成功:
或者执行一下pip3
1)data注解:支持一个数据或者是多个数据的传入甚至是一个读取文件的函数,多组数据之间用[]括起来,多组数据之间使用逗号进行分割
** @data(方法名('文件名字'))*
2)unpack:多个数据传入的时候需要对一组数据进行映射,测试数据和测试方法参数的映射
3)file_data:测试数据在json文件中,和测试方法中的参数进行映射
一)使用ddt和data和unpack(多个数据传入)注解
import unittest from ddt import ddt, data, unpack ,file_data from selenium import webdriver import time @ddt class TestBaiDu(unittest.TestCase): def setUp(self): self.driver = webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe") self.url="http://www.baidu.com" self.driver.maximize_window() def tearDown(self): time.sleep(3) self.driver.quit() @data("张三","李四","王二麻子","小淘气") def test_baidu1(self, value): driver=self.driver url=self.url driver.get(url) time.sleep(1) driver.find_element_by_id("kw").clear() time.sleep(2) driver.find_element_by_id("kw").send_keys(value) time.sleep(1) driver.find_element_by_id("su").click() time.sleep(3) @data(["张天", "百度搜索"], ["生命在于运动", "我的小孩子"], ["可可脂巧克力", "我的好兄弟"]) @unpack def test_baidu2(self,value1,value2): driver=self.driver url=self.url driver.get(url) driver.find_element_by_id("kw").clear() time.sleep(3) driver.find_element_by_id("kw").send_keys(value1) driver.find_element_by_id("su").click() time.sleep(3) if __name__ == '__main__': unittest.main()
二)使用ddt.file_data来修饰
1)选择读取普通的txt文件,需要写读取文件的代码
import csv import sys import unittest from ddt import ddt, data, unpack ,file_data from selenium import webdriver import time @ddt class TestBaiDu(unittest.TestCase): def setUp(self): self.driver = webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe") self.url="http://www.baidu.com" self.driver.maximize_window() def tearDown(self): time.sleep(3) self.driver.quit() @data("张三","李四","王二麻子","小淘气") def test_baidu1(self, value): driver=self.driver url=self.url driver.get(url) time.sleep(1) driver.find_element_by_id("kw").clear() time.sleep(2) driver.find_element_by_id("kw").send_keys(value) time.sleep(1) driver.find_element_by_id("su").click() time.sleep(3) @data(["张天", "百度搜索"], ["生命在于运动", "我的小孩子"], ["可可脂巧克力", "我的好兄弟"]) @unpack def test_baidu2(self,value1,value2): driver=self.driver url=self.url driver.get(url) driver.find_element_by_id("kw").clear() time.sleep(3) driver.find_element_by_id("kw").send_keys(value1) driver.find_element_by_id("su").click() time.sleep(3) def GetAll(filename): rows=[] path=sys.path[0] with open(path+'/data/'+filename,"rt") as f: readers=csv.reader(f,delimiter=',',quotechar='|') next(readers, None) for row in readers: temprows = [] for i in row: temprows.append(i) rows.append(temprows) return rows #([张三,张三百度搜索],[李四,李四百度搜索],[王五,王五百度搜索]) @data(*GetAll('test_baidu_data.txt')) @unpack def test_baidu3(self,value1,value2): driver = self.driver url = self.url driver.get(url) driver.find_element_by_id("kw").clear() time.sleep(3) driver.find_element_by_id("kw").send_keys(value1) driver.find_element_by_id("su").click() if __name__ == '__main__': unittest.main()
2)选择读取json格式的文件,不需要再写额外读取函数的代码
import csv import sys import unittest from ddt import ddt, data, unpack ,file_data from selenium import webdriver import time @ddt class TestBaiDu(unittest.TestCase): def setUp(self): self.driver = webdriver.Edge("C://Users//18947//AppData//Local//Programs//Python//Python310//msedgedriver.exe") self.url="http://www.baidu.com" self.driver.maximize_window() def tearDown(self): time.sleep(3) self.driver.quit() @unittest.skip("skipping") @data("张三","李四","王二麻子","小淘气") def test_baidu1(self, value): driver=self.driver url=self.url driver.get(url) time.sleep(1) driver.find_element_by_id("kw").clear() time.sleep(2) driver.find_element_by_id("kw").send_keys(value) time.sleep(1) driver.find_element_by_id("su").click() time.sleep(3) @data(["张天", "百度搜索"], ["生命在于运动", "我的小孩子"], ["可可脂巧克力", "我的好兄弟"]) @unpack @unittest.skip("skipping") def test_baidu2(self,value1,value2): driver=self.driver url=self.url driver.get(url) driver.find_element_by_id("kw").clear() time.sleep(3) driver.find_element_by_id("kw").send_keys(value1) driver.find_element_by_id("su").click() time.sleep(3) def GetAll(filename): rows=[] path=sys.path[0] with open(path+'/data/'+filename,"rt") as f: readers=csv.reader(f,delimiter=',',quotechar='|') next(readers, None) for row in readers: temprows = [] for i in row: temprows.append(i) rows.append(temprows) return rows #([张三,张三百度搜索],[李四,李四百度搜索],[王五,王五百度搜索]) @file_data('test_baidu_data.json') def test_baidu3(self,value): driver = self.driver url = self.url driver.get(url) driver.find_element_by_id("kw").clear() time.sleep(3) driver.find_element_by_id("kw").send_keys(value) driver.find_element_by_id("su").click() if __name__ == '__main__': unittest.main()
版权归原作者 每天想要幸福一点点 所有, 如有侵权,请联系我们删除。