http://blog.youkuaiyun.com/huilan_same/article/details/76572481
怎样从0开始搭建一个测试框架_4
这一步我们需要用到并修改HTMLTestRunner.py,它本身是基于PY2的,简单而实用,之前博主对其进行了美化,并且改成了中文(下载链接)。
现在博主基于此进行了对PY3的修改,增加了对subTest的支持。
【更新】增加了一个用Echarts做的统计图,见github
- StringIO -> io
- 去掉decode
- 增加addSubTest()
部分修改内容:
# import StringIO # PY3改成了io库
import io
...
def startTest(self, test):
TestResult.startTest(self, test)
# just one buffer for both stdout and stderr
# self.outputBuffer = StringIO.StringIO()
self.outputBuffer = io.StringIO()
...
# 添加addSubTest方法,将有subTest的Case拆分成多个Case,均在报告中输出。这点处理与unittest的TextRunner并不相同,细心的同学可以试验下,看看它是怎么处理的。
def addSubTest(self, test, subtest, err):
if err is not None:
if getattr(self, 'failfast', False):
self.stop()
if issubclass(err[0], test.failureException):
self.failure_count += 1
errors = self.failures
errors.append((subtest, self._exc_info_to_string(err, subtest)))
output = self.complete_output()
self.result.append((1, test, output + '\nSubTestCase Failed:\n' + str(subtest),
self._exc_info_to_string(err, subtest)))
if self.verbosity > 1:
sys.stderr.write('F ')
sys.stderr.write(str(subtest))
sys.stderr.write('\n')
else:
sys.stderr.write('F')
else:
self.error_count += 1
errors = self.errors
errors.append((subtest, self._exc_info_to_string(err, subtest)))
output = self.complete_output()
self.result.append(
(2, test, output + '\nSubTestCase Error:\n' + str(subtest), self._exc_info_to_string(err, subtest)))
if self.verbosity > 1:
sys.stderr.write('E ')
sys.stderr.write(str(subtest))
sys.stderr.write('\n')
else:
sys.stderr.write('E')
self._mirrorOutput = True
else:
self.subtestlist.append(subtest)
self.subtestlist.append(test)
self.success_count += 1
output = self.complete_output()
self.result.append((0, test, output + '\nSubTestCase Pass:\n' + str(subtest), ''))
if self.verbosity > 1:
sys.stderr.write('ok ')
sys.stderr.write(str(subtest))
sys.stderr.write('\n')
else:
sys.stderr.write('.')
...
def run(self, test):
"Run the given test case or test suite."
result = _TestResult(self.verbosity)
test(result)
self.stopTime = datetime.datetime.now()
self.generateReport(test, result)
# print >>>sys.stderr '\nTime Elapsed: %s' % (self.stopTime-self.startTime) # PY3的print需处理
print('\nTime Elapsed: %s' % (self.stopTime-self.startTime), file=sys.stderr)
return result
...
# PY3这里不用decode了,直接处理
# if isinstance(o,str):
# # TODO: some problem with 'string_escape': it escape \n and mess up formating
# # uo = unicode(o.encode('string_escape'))
# # uo = o.decode('latin-1')
# uo = o.decode('utf-8')
# else:
# uo = o
# if isinstance(e,str):
# # TODO: some problem with 'string_escape': it escape \n and mess up formating
# # ue = unicode(e.encode('string_escape'))
# # ue = e.decode('latin-1')
# ue = e.decode('utf-8')
# else:
# ue = e
script = self.REPORT_TEST_OUTPUT_TMPL % dict(
id = tid,
# output = saxutils.escape(uo+ue),
output = saxutils.escape(o+e),
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
以上代码列出大部分主要修改。博主在GitHub上上传了该文件,目前仅是简单做了点修改,没有经过正式的测试,之后可能会进行更多改动,感兴趣的可以star下来,或者自己进一步修改。
你也自己编写自己的Report Runner,并不很复杂。
将其放在utils目录中,然后我们再次修改test_baidu:
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from utils.config import Config, DRIVER_PATH, DATA_PATH, REPORT_PATH
from utils.log import logger
from utils.file_reader import ExcelReader
from utils.HTMLTestRunner import HTMLTestRunner
class TestBaiDu(unittest.TestCase):
URL = Config().get('URL')
excel = DATA_PATH + '/baidu.xlsx'
locator_kw = (By.ID, 'kw')
locator_su = (By.ID, 'su')
locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')
def sub_setUp(self):
self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')
self.driver.get(self.URL)
def sub_tearDown(self):
self.driver.quit()
def test_search(self):
datas = ExcelReader(self.excel).data
for d in datas:
with self.subTest(data=d):
self.sub_setUp()
self.driver.find_element(*self.locator_kw).send_keys(d['search'])
self.driver.find_element(*self.locator_su).click()
time.sleep(2)
links = self.driver.find_elements(*self.locator_result)
for link in links:
logger.info(link.text)
self.sub_tearDown()
if __name__ == '__main__':
report = REPORT_PATH + '\\report.html'
with open(report, 'wb') as f:
runner = HTMLTestRunner(f, verbosity=2, title='从0搭建测试框架 灰蓝', description='修改html报告')
runner.run(TestBaiDu('test_search'))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
执行后,可以在report目录下看到有 report.html
文件,我们已经生成测试报告了。