前面在编写自动化测试用例的时候,使用了HTMLTestRunner,是对于测试用例执行结果的一个统计和展示的报告。
Allure 是一个report框架,可以基于一些测试框架生成测试报告,比较常用的一般是Junit/Testng框架;
Allure 生成的报告样式简洁美观,同时又支持中文;
Allure还支持使用Jenkins工具持续集成,整套环境搭建下来以后,使用起来非常方便。
因为这里也需要用到pytest去运行最后编写的case,那么这里也了解下pytest.
pytest和unittest差不多,都是测试框架,功能比unit test多。都是识别以test开头的case 然后依次去执行。
1、需要有jdk1.8+环境
2、下载Allure包,地址:https://pan.baidu.com/s/1Za-9Dny5ha_0rCdpPm0o2A
下载下来包后直接解压,放到一个指定目录下,然后将下面的bin目录添加到path系统环境变量中:
完了后,打开cmd,输入 allure --version,有版本信息出现代表成功。
3、安装pytest
pip install pytest
4、安装allure-pytest
pip install allure-pytest
5、试着写一个简单的py文件,然后用allure展示出来
import allure
import pytest
@allure.feature('test_module_01')
@allure.story('test_story_01')
@allure.severity('blocker')
def test_case_01():
"""
用例描述:Test case 01
"""
assert 0
@allure.feature('test_module_01')
@allure.story('test_story_01')
@allure.severity('critical')
def test_case_02():
"""
用例描述:Test case 02
"""
assert 0 == 0
@allure.feature('test_module_01')
@allure.story('test_story_02')
@allure.severity('normal')
def test_case_03():
"""
用例描述:Test case 03
"""
assert 0
@allure.feature('test_module_01')
@allure.story('test_story_02')
@allure.severity('minor')
def test_case_04():
"""
用例描述:Test case 04
"""
assert 0 == 0
@allure.feature('×××') #一级分层
@allure.story('×××') #二级分层
@allure.serverity('×××') #case重要级
6、cmd命令行,用pytest命令将py文件转成json样式的文件
pytest test.py --alluredir allure-report
*注意:如果后面省略test.py 文件名,也就是不指定运行某一个py文件,那么就会去运行当前目录下所有以 test_开头的py文件中的case!!
当然执行命令的时候你可以添加一些参数,如:
-q: 减少用例执行过程叙述
-v:增加用例执行过程叙述
-k:只运行匹配到的测试用例。-k 'test_method or test_other' 只会匹配运行包含test_method 或 test_other 的用例; -k 'not test_method and not test_other' 会匹配运行既不包含test_method 也不包含test_other 的用例。
其他更多好玩的用法指路:
然后你可以看到在本目录下生成了一个allure-report的文件夹,里面放着一些文件:
当然你也可以直接在你的case文件里运行,如下:
if __name__ == '__main__':
pytest.main([ __file__, '-s','-q','--alluredir', 'allure-report'])
7、使用allure命令将上述生成的文件转成报表,HTML格式
allure generate ison/ -o html
可以看到生成了html的一个文件夹,里面就是html形式allure报告文件相关的东西
如果直接在文件夹里打开这个index.html 文件的话,很可能出现跟我一样的情况,如下:(空白页一直转圈圈)
这里我是直接在pycharm里面打开的,(看网上说也可以用Firefox直接打开)。步骤如下:
然后就可以看到报告生成了。
在上述生成的html中我们可以看到,已经用例的基本框架已经差不多了,但这只是基本的,接下来试着把用例更加详细化一点呢。
比如说,在测试用例里面添加一些执行步骤:
修改上面的test_case_01:
def test_case_01():
"""
用例描述:Test case 01
客户登陆客户端
"""
with allure.step('输入用户账号'):
allure.attach('***输入账号为:zhangdan')
with allure.step('输入用户密码'):
allure.attach('***输入密码为:123456')
with allure.step('点击登陆按钮'):
allure.attach('***提交登陆信息')
with allure.step('获取成功与否标识'):
allure.attach('***主页=成功,登陆=失败')
attention = '主页'
assert attention == '主页'
上面又用到了,allure.attach('××× ') 附件:
allure.attach(body, name, attachment_type, extension)
body
- 要写入文件的原始内容。
name
- 包含文件名的字符串
attachment_type
- 其中一个allure.attachment_type值 。
(支持:HTML,JPG,PNG,JSON,OTHER,TEXTXML)
extension
- 提供的将用作创建文件的扩展名
或者 allure.attach.file(source, name, attachment_type, extension) ---【有待考证】
source
- 包含文件路径的字符串。
既然都到这里了,那么我想把allure报告与自己之前写好的实际场景的测试用例结合起来....
之前我已经用unittest+ HTMLtestrunner 生成过html形式报表过了,那么我就在之前的用例上做下修改:
拿用户登陆测试....
之前的用例:
filepath = os.path.abspath('.').split('test')[0] + 'test\\element\\testcase.xls'
re = IOExcel(filepath) # 获取测试用例数据
caseData = re.get_sheet('login') #获取***sheet页的数据
class loginTest(unittest.TestCase):
#每条case执行的前置条件
def setUp(self):
browser = Browser().open_browser()
self.bpage = BasePage(browser)
self.lpage = loginCase(self.bpage) # 初始化page页类
#每条case执行的后置条件
def tearDown(self):
self.bpage.close_browser()
def test_loginSuccess0(self):
#获取第**sheet页的第*行的数据,返回为list
rowData = re.get_rowData(2)
self.lpage.login_page_quick(rowData[4],rowData[5],rowData[6])
self.bpage.delay(1)
try:
self.assertEqual(self.bpage.get_title(),rowData[9],'测试用例通过')
except Exception as e :
re.write_cell(2,10,'不通过')
print(e)
else:
re.write_cell(2, 10, '通过')
现在的一条用例:
@allure.feature('登陆')
@allure.story('用户登陆成功')
@allure.severity('blocker') # 设置用例重要级
def test_loginSuccess0():
''' 用户登陆成功的用例 '''
browser = Browser().open_browser()
bpage = BasePage(browser)
lpage = loginCase(bpage) # 初始化page页类
#获取第**sheet页的第*行的数据,返回为list
rowData = re.get_rowData(2)
lpage.login_page_quick(rowData[4],rowData[5],rowData[6])
with allure.step('输入账号%s' % rowData[4]):
pass
with allure.step('输入密码%s' % rowData[5]):
pass
with allure.step('点击登陆'):
pass
bpage.delay(1)
allure.step('延迟一秒')
try:
# assertEqual(bpage.get_title(),rowData[9],'测试用例通过')
assert bpage.get_title() == rowData[9]
except Exception as e :
re.write_cell(2,10,'不通过')
print(e)
else:
re.write_cell(2, 10, '通过')
bpage.close_browser()
生成的用例报告:
看到上图的报告,我们可以知道:
1、编写测试步骤,直接用allure.step('××'×) 是无法展示出来的,需要使用with allure.step('××'×) *** 才能正确展示。
2、allure还可以自动地把输出到日志文件中的日志 以及 输出到控制台中的日志 都集中展示到html报表中。
这样一比较,确实allure 比 htmltestrunner 好用得多~