前言
我们使用pytest+allure生成Allure自动化测试报告后,需要发给领导或者客户查看报告的详细信息。此时我们通过将allure生成的html报告压缩成压缩包后发送给领导,但是领导电脑由于没有安装Allure服务,打开会全部显示“Loading”, 无法查看到报告的具体内容。(如下图所示)
那么此时我们应该怎么办呢?
注意:本文方法只适用于windows
解决办法一(需安装Chrome)
前提:电脑安装了Chrome浏览器(注册表里面能够找到chrome)
新建一个txt文件,名称自定义,例如“openReport.bat”, 输入如下内容:
@echo off
setlocal enabledelayedexpansion
set "chrome_path="
::从注册表查找谷歌浏览器路径
set reg_query_command=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe" /ve
::遍历注册表查询结果
for /f "tokens=2*" %%A in ('%reg_query_command%') do (
::如果有REG_SZ,则证明找到了谷歌浏览器
if "%%A"=="REG_SZ" (
::如果路径存在,则设置谷歌浏览器绝对路径到变量chrome_path
set "tmp_chrome_path=%%B"
if exist "!tmp_chrome_path!" (
set "chrome_path=%%B"
)
)
)
::打印找到了谷歌浏览器的文件地址
echo Chrome found at: "%chrome_path%"
::带参启动谷歌浏览器,使其不校验跨域问题(./表示当前目录, 可以修改为你所需要的工作目录)
%chrome_path% --disable-web-security --user-data-dir="%~dp0/tmp" "%~dp0/index.html"
修改“openReport.txt”的文件后缀为.bat, 例如“openReport.bat”。并将文件防止在allure html报告的根目录下:
然后双击“openReport.bat”就可以打开报告啦~
解决办法二(未安装chrome使用手写服务打开)
上面的方法,要求必须安装了chrome浏览器,以及注册表里面能找到chrome。 任一条件不满足,就无法打开报告。
我们需要了解打开allure-html报告的原理,其实就是将allure-html报告以静态文件服务器的方式打开。因此我们需要一个服务来支撑我们打开allure-html报告。
1. 使用python写一个服务
首先我们先使用python自带的模块http.server来写一个服务,具体代码如下:
文件名:http_server.py
```python
# -*- coding: utf-8 -*-
# @Time : 2023/5/24 9:34
# @Author : chenyinhua
# @File : http_server.py
# @Software: PyCharm
# @Desc:
import http.server
import socketserver
import os
from functools import partial
import sys
class HttpServer:
def __init__(self, bind: str = "127.0.0.1", port: int = 8000, directory=os.getcwd()):
"""
:param bind: 指定地址,如本地主机
:param port: 自定义端口号, 服务器默认监听端口是 8000
:param directory: 指定工作目录, 服务器默认工作目录为当前目录
"""
self.bind = bind
self.port = port
self.directory = directory
args = sys.argv
for i in range(1, len(args)):
if args[i] == "-port" and i + 1 < len(args):
self.port = int(args[i + 1])
if args[i] == "-dir" and i + 1 < len(args):
self.directory = args[i + 1]
if args[i] == "-bind" and i + 1 < len(args):
self.bind = args[i + 1]
def run(self):
try:
with socketserver.TCPServer((self.bind, self.port), partial(http.server.SimpleHTTPRequestHandler,
directory=self.directory)) as httpd:
print(
f"工作目录:{self.directory}\n"
f"Serving HTTP on {self.bind} port {self.port} \n"
f"http://{self.bind}:{self.port}/ ..."
)
httpd.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
sys.exit(0)
if __name__ == '__main__':
server = HttpServer()
server.run()
2. 将服务打包成exe文件
然后将这个服务使用Pyinstaller模块打包成exe文件。
1)安装Pyinstaller: pip install pyinstaller
2) 打包python服务:pyinstaller -F Python 源文件, 例如pyinstaller -F Python http_server.py
打包后会生成一个build目录,dist目录,http_server.spec文件。 我们只需要用到dist目录下的http_server.exe。
3) 将http_server.exe复制到allure-html报告根目录下。
3. 改写“openReport.bat”
原理是google未安装的情况下,就启动http_server.exe打开allure-html报告。
可以通过-bing指定地址,-port指定端口,-dir指定工作目录。
例如:http-server.exe -port 5001
改写后内容如下:
@echo off
setlocal enabledelayedexpansion
set "chrome_path="
::从注册表查找谷歌浏览器路径
set reg_query_command=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe" /ve
::遍历注册表查询结果
for /f "tokens=2*" %%A in ('%reg_query_command%') do (
::如果有REG_SZ,则证明找到了谷歌浏览器
if "%%A"=="REG_SZ" (
::如果路径存在,则设置谷歌浏览器绝对路径到变量chrome_path
set "tmp_chrome_path=%%B"
if exist "!tmp_chrome_path!" (
set "chrome_path=%%B"
)
)
)
::如果上面找到了谷歌浏览器的路径
if defined chrome_path (
::打印找到了谷歌浏览器的文件地址
echo Chrome found at: "%chrome_path%"
::带参启动谷歌浏览器,使其不校验跨域问题 (./表示当前目录, 可以修改为你所需要的工作目录)
"%chrome_path%" --disable-web-security --user-data-dir="%~dp0/tmp" "%~dp0/index.html"
) else (
::如果没找到,打印没找到
echo Chrome not found.
::打印启动web信息
echo start a webserver ...
::启动一个web服务监听5001端口,在后台运行。默认用当前文件夹的index.html作为首页
start /b http_server.exe -port 5001
::使用默认浏览器打开web服务的地址并等待浏览器关闭
start "" /WAIT http://127.0.0.1:5001
)
“openReport.bat”也放在allure-html报告根目录下
4. 打开测试报告
双击“openReport.bat”文件,会自动调用http-server(未安装google浏览器的情况)并使用默认浏览器打开http://127.0.0.1:5001地址,就可以看到测试报告啦~
遇到的问题
- 电脑默认浏览器是Google,但是找不到Chrome
上述方法二存在一个问题:当电脑设置了默认浏览器是Google,但是找不到Google的时候会无法打开报告。原因在于启动服务打开报告是使用电脑的默认浏览器打开的。
为了解决这个问题,继续优化了一下“openReport.bat”里面的内容。优化后如下所示:
@echo off
setlocal enabledelayedexpansion
set "chrome_path="
::从注册表查找谷歌浏览器路径
set reg_query_command=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe" /ve
::遍历注册表查询结果
for /f "tokens=2*" %%A in ('%reg_query_command%') do (
::如果有REG_SZ,则证明找到了谷歌浏览器
if "%%A"=="REG_SZ" (
::如果路径存在,则设置谷歌浏览器绝对路径到变量chrome_path
set "tmp_chrome_path=%%B"
if exist "!tmp_chrome_path!" (
set "chrome_path=%%B"
)
)
)
::如果上面找到了谷歌浏览器的路径
if defined chrome_path (
::打印找到了谷歌浏览器的文件地址
echo Chrome found at: "%chrome_path%"
::带参启动谷歌浏览器,使其不校验跨域问题
"%chrome_path%" --disable-web-security --user-data-dir="%~dp0/tmp" "%~dp0/index.html"
) else (
::如果没找到,打印没找到
echo Chrome not found.
::打印启动web信息
echo start a webserver ...
::启动一个web服务监听5001端口,在后台运行。默认用当前文件夹的index.html作为首页
start /b http_server.exe -port 5001
::使用Edge浏览器打开web服务的地址并等待浏览器关闭
start /WAIT msedge.exe http://127.0.0.1:5001
)
2. 由于中文注释导致无法打开报告
注意:如果报告打不开,尝试移除.bat文件里面所有中文注释,再重新尝试
以下是移除中文注释的版本。
@echo off
setlocal enabledelayedexpansion
set "chrome_path="
set reg_query_command=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe" /ve
for /f "tokens=2*" %%A in ('%reg_query_command%') do (
if "%%A"=="REG_SZ" (
set "tmp_chrome_path=%%B"
if exist "!tmp_chrome_path!" (
set "chrome_path=%%B"
)
)
)
if defined chrome_path (
echo Chrome found at: "%chrome_path%"
"%chrome_path%" --disable-web-security --user-data-dir="%~dp0/tmp" "%~dp0/index.html"
) else (
echo Chrome not found.
echo start a webserver ...
start /b http_server.exe -port 5001
start /WAIT msedge.exe http://127.0.0.1:5001
)
(注:本文将会持续更新,敬请期待……)
本文参考来源:https://blog.csdn.net/FloraCHY/article/details/130831890