tslrunner 0.2.11
tslsmart solution for HTTP(S) testing.
License: Apache-2.0
Requires Python: >=3.6.2,<4.0.0
Keywords: HTTP,api,test,requests,locustio

# httprunner_tsl

## 介绍
根据httprunner 3.1.6 版本修改添加功能
1.增加根据目录生成用例名称（中文支持）
2.根据配置化生成参数传入

## 软件架构
软件架构说明


## 安装教程
```shell
>pip install tslrunner
```
或者
```shell
>pip install --index-url  http://192.168.118.144:8081/repository/pypi-group/simple tslrunner==0.1.64 --trusted-host 192.168.118.144
```

## 使用说明
~~
神弓容器中的文件已经修复此问题
1.  修复pytest-html中文乱码
\python3.9\Lib\site-packages\pytest_html\plugin.py

找到140行，改为
self.test_id = report.nodeid.encode("utf-8").decode("utf-8")
~~

2. 生成用例
har2case_batch
参数说明
-vd 断言验证response的 Data字段内容
--change_token 替换http请求头的 Authorization 和 token字段为等号后的内容，用于自动调用debugtalk的函数获取token
-add 增加env文件和data目录中的csv文件
-gen 生成suite用例文件。规则是每个目录生成一个suite文件，suite包含目录下所有的用例。

* 单个文件生成用例
```shell
har2case userList.har -vd --change_token=${get_token()}
```
* 批量生成用例，在项目的根目录输入一下命令
```shell
har2case_batch . -vd --change_token=${get_token()} -add -gen
```
* SSO统一登录资源所有者密码登录，用下面命令：
```shell
har2case_batch . -vd --change_token=${get_oss_resource_token()} -add -gen
```
* SSO统一登录授权码登录，用下面命令：
```shell
har2case_batch . -vd --change_token=${get_oss_auth_token()} -add -gen
```


## 执行用例
使用 tslrun 命令
参数说明：
#### -path 必填，指定运行项目的目录，如果在当前目录用. 代替
#### -tag 运行指定pytest.mark.? 的用例集。等同于pytest -m
#### -env 替换.env文件中的环境变量
#### -project 替换报告中的项目名称
#### -app 替换报告中的应用名

```shell
tslrun -path tslrunner_demo -tag normal -env 'base_ip=192.168.0.1:30200;user_name=卢维森' -project "TACOS控制面板" -app micro-panel
```

## 神弓集成
```shell
pip install --index-url  http://192.168.118.144:8081/repository/pypi-group/simple tslrunner==0.1.64 --trusted-host 192.168.118.144

tslrun -path tslrunner_demo -tag normal -env 'base_ip=192.168.125.149:31006;user_name=testuser' -project "TACOS控制面板" -app micro-panel

mkdir -p /opt/autotest/${JOB_NAME}/${BUILD_NUMBER}/
cp ./tslrunner_demo/report.html /opt/autotest/${JOB_NAME}/${BUILD_NUMBER}/report.html
```

## 用例编写注意事项
1. 需要用参数的时候，取消suite文件中参数文件的注释，并根据自己参数的文件修改参数配置

    ```shell
    #@pytest.mark.parametrize("param", Parameters({'param1-param2-param3': '${P(data/test.csv)}'}),)

    #def test_start(self, param):

    #super().test_start(param)
    ```

2. 复杂json返回的断言用jmespath规则书写
    * 定位到data列表中的某各对象的某各id
    ##### .assert_equal("body.data[?roleName=='测试角色UAT1'].id", ["1767b7d1360a4cc5825f3f37bab4013c"])
    
    ```shell
    body     : {
    "code": "00000000",
    "success": true,
    "message": "成功",
    "data": [
        {
            "id": "1767b7d1360a4cc5825f3f37bab4013c",
            "roleName": "测试角色UAT1",
            "userNum": "0",
            "appNum": "4",
            "menuNum": "4",
            "resNum": "14"
        },
        ......
    ```

    * 定位到多级data列表的参数param1为名字对象的loginAccount。param1 = testuser99，param2 =  testuser99

    ##### .assert_equal("body.data.datas[?userName=='${param1}'].loginAccount", ["${param2}"])
    ```shell
    body     : {
    "code": "00000000",
    "success": true,
    "message": "成功",
    "data": {
        "pageSize": 10,
        "currentPage": 1,
        "totalPages": 1,
        "totalRows": 6,
        "minRowNumber": 1,
        "maxRowNumber": 6,
        "datas": [
            {
                "id": "766315902aa143ac80f72d4797086820",
                "userName": "testuser99",
                "loginAccount": "testuser99",
                "email": null,
                "phone": "18999999999",
                "status": "1",
                "userGroups": [],
                "roles": []
            },
        ......
    ```

3. 环境地址参数用IDE批量替换功能替换
    例如.env文件中定义的base_ip, 在用例中批量替换成 ${ENV(base_ip)}
    .get("http://${ENV(base_ip)}/api/resource/role/list")

4. 获取参数传参的时候，不能使用参数$变量！
   ##### .extract().with_jmespath("body.data.datas[?userName=='testuser99']| [0].id", "addUserId")