测试【七】:HTML报告的生成、异常捕捉与错误截图、数据驱动

目录

  • 一、HTML报告的生成
  • 二、异常捕捉与错误截图
  • 三、数据驱动

一、HTML报告的生成

脚本执行完毕之后,还需要看到HTML报告,需要通过HTMLTestRunner.py 来生成测试报告。
HTMLTestRunner.py 文件下载地址
下载后将其放在testcase目录中去或者放入…\Python\Lib 目录下(windows)
示例代码如下:

import unittest,csv
import os,sys
import time
#手工添加案例到套件,
import HTMLTestRunner


def createsuite():
    discover=unittest.defaultTestLoader.discover('E:/Pythoncode',pattern='test*.py',top_level_dir=None)
    print (discover)
    return discover
if __name__=="__main__":
    curpath=sys.path[0]
    #sys.path是一个list
    #取当前时间
    #对时间格式化time.strftime("格式化的形式",time.localtime本地时间,time.time()获取时间戳)
    #为了生成的HTML报告名字不重复,引入时间戳   时间戳time.time()
    #将时间戳转换为本地的一个时间time.localtime(time.time())
    #再将本地时间以"%Y-%m-%d-%H %M:%S"的形式输出
    now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
    if not os.path.exists(curpath+'/resultreport'):
        os.makedirs(curpath+'/resultreport')
        #经过上述步骤,已经得到了HTML报告的名称
        filename=curpath+'/resultreport/'+now+'resultreport.html'
        #打开HTML文件,wb以写的方式
        with open(filename,'wb') as fp:
        #出html报告
        # 括号里的参数是HTML报告里面的参数
            runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'测试报告',description=u'用例执行情况',verbosity=2)
            suite=createsuite()
            runner.run(suite)

执行后会生成
在这里插入图片描述

HTML报告示例:
测试【七】:HTML报告的生成、异常捕捉与错误截图、数据驱动_第1张图片
测试【七】:HTML报告的生成、异常捕捉与错误截图、数据驱动_第2张图片

二、异常捕捉与错误截图

用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将是一个非常棒的功能,也会给我们错误定位带来方便。

截图保存的代码为:

def savescreenshot(self,driver,file_name):
        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)

示例代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
import os
class Baidu1(unittest.TestCase):
#test fixture,初始化环境
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
        # 测试用例,必须以test开头
    def test_hao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("hao123").click()
        time.sleep(2)
        try:
            self.assertEqual(u'hao_上网从这里开始', driver.title)
        except:
            self.savescreenshot(driver,'hao.png')
            #判断element是否存在,可删除
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
        #判断alert是否存在,可删除
    def is_alert_present(self):
        try: self.driver.switch_to.alert
        except NoAlertPresentException as e: return False
        return True
        #关闭alert,可删除
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to.alert
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
        #test fixture,清除环境
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
    def savescreenshot(self,driver,file_name):
        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)
if __name__ == "__main__":
#执行用例
    unittest.main()

执行后会产生:
在这里插入图片描述
测试【七】:HTML报告的生成、异常捕捉与错误截图、数据驱动_第3张图片

三、数据驱动

使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据。可以将测试脚本与测试数据分离,使得测试脚本在不同数据集合下高度复用。不仅可以增加复杂条件场景的测试覆盖,还可以极大减少测试脚本的编写与维护工作。
python 的unittest 没有自带数据驱动功能。所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成。

  1. dd.ddt:装饰类,也就是继承自TestCase的类。
  2. ddt.data:装饰测试方法。参数是一系列的值。
  3. ddt.file_data:装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。
  4. ddt.unpack:传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。字典也可以这样处理。

为了创建数据驱动测试,需要在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符。@data装饰符把参数当作测试数据,参数可以是单个值、列表、元组、字典。对于列表,需要用@unpack装饰符把元组和列表解析成多个参数。

使用外部数据的数据驱动测试
  如果外部已经存在了需要的测试数据,如一个文本文件、电子表格或者数据库,那也可以用ddt来直接获取数据并传入测试方法进行测试。

你可能感兴趣的:(测试)