使用unittest进行时selenium网页自动化测试,想要传入不同case,实现相同得测试操作,并生成HTML报告。其中,通常需要同时实现三个功能:
- unittest参数化:使用parameterized,可实现数据驱动测试,传入多组参数自动生成多个用例,实现参数化。(这个网上教程很多)
- selenium只开一次浏览器:每个测试用例都打开一次浏览器,会增加执行时间。使用@classmethod装饰器,实现不同testcase运行时只开一次浏览器。
(注意!此方法适用对用例进行参数化,对整个class参数化得使用重写__init__的方法https://blog.csdn.net/weixin_42801714/article/details/116198923) - 生成HTML报告:使用三方HTMLTestReport。
(注意!不要直接以unittest 框架运行https://www.cnblogs.com/zenghongfei/p/12165808.html)
具体实现代码如下:
# -*- coding: utf-8 -*-
# @FileName: webtest.py
import unittest
from parameterized import parameterized
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
case = ['unittest', 'parametrized', 'selenium']
class BaiDu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = 'https://www.baidu.com'
print("Open chrome......")
@classmethod
def tearDownClass(cls):
print("Close chrome......")
cls.driver.quit()
@parameterized.expand(case)
def test_search(self, input):
driver = self.driver
driver.get('https://www.baidu.com')
driver.find_element_by_xpath("//*[@id='kw']").send_keys(input)
WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='su']")))
driver.find_element_by_xpath("//*[@id='su']").click()
#检查搜索内容和case是否相同
time.sleep(1)
self.assertEqual(self.driver.title, input+"_百度搜索")
if __name__ == '__main__':
unittest.main(verbosity=2)
# -*- coding: utf-8 -*-
# @FileName: report.py
# 运行report进行测试并生成报告
import unittest
import HTMLTestReportEN
if __name__ == '__main__':
discover = unittest.defaultTestLoader.discover(start_dir='./', pattern="webtest.py")
fp = open('./TestReport.html', 'wb')
runner = HTMLTestReportEN.HTMLTestRunner(stream=fp, title='Web test',description='Test in BaiDu.',tester="vegetable000", verbosity=2)
runner.run(discover)
fp.close()
最终报告: