脚本执行完毕之后,还需要看到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)
用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将是一个非常棒的功能,也会给我们错误定位带来方便。
截图保存的代码为:
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()
使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据。可以将测试脚本与测试数据分离,使得测试脚本在不同数据集合下高度复用。不仅可以增加复杂条件场景的测试覆盖,还可以极大减少测试脚本的编写与维护工作。
python 的unittest 没有自带数据驱动功能。所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成。
为了创建数据驱动测试,需要在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符。@data装饰符把参数当作测试数据,参数可以是单个值、列表、元组、字典。对于列表,需要用@unpack装饰符把元组和列表解析成多个参数。
使用外部数据的数据驱动测试:
如果外部已经存在了需要的测试数据,如一个文本文件、电子表格或者数据库,那也可以用ddt来直接获取数据并传入测试方法进行测试。