首页 > 其他分享 >pytest 执行用例 将测试结果追加到表格并生成测试报告并推送至企微

pytest 执行用例 将测试结果追加到表格并生成测试报告并推送至企微

时间:2024-10-25 11:21:18浏览次数:6  
标签:sheet 测试报告 企微 用例 pytest workbook import data name

ReadExcel
# -*- coding:utf-8 -*-

from openpyxl import load_workbook
import os


class TestExcel():

    def get_TestExcel(self, file_name, sheet_name):
        print("======", os.getcwd())
        # workbook = load_workbook('Datas.xlsx')#打开表
        # sheet = workbook['jack']#定位表单
        workbook = load_workbook(file_name)  # 打开表
        sheet = workbook[sheet_name]  # 定位表单

        test_data = []  # 把所有行的数据放到列表中

        for i in range(2, sheet.max_row + 1):
            sub_data = {}  # 把每行的数据放到字典中
            for j in range(1, sheet.max_column + 1):
                sub_data[sheet.cell(1, j).value] = sheet.cell(i, j).value

            test_data.append(sub_data)  # 拼接每行单元格的数据

        return test_data

class WriteExcel():

    def write_result(file_name,sheet_name,row,column,result):
        workbook = load_workbook(file_name)
        sheet = workbook[sheet_name]
        sheet.cell(row,column).value = result
        workbook.save(file_name)
        workbook.close()
        return True

if __name__ == "__main__":
    te = TestExcel()


    txt = te.get_TestExcel("../data/supdatas.xlsx", "staging")

conftest
#encoding=utf-8
# conftest.py
import json
import time

import requests
from py.xml import html
import pytest


def pytest_html_report_title(report):
    report.title = "Pro线上 接口测试结果"


# def pytest_configure(config):
#     # config._metadata['测试地址'] = "生产环境"
#     config._metadata.pop("Platform")
#     config._metadata.pop("Plugins")
#     config._metadata.pop("Python")
#     config._metadata.pop("Packages")


def pytest_html_results_table_header(cells):
    cells.insert(1, html.th("Description"))
    cells.pop()  # 默认删除最后一个列表值


def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(report.description))
    cells.pop()


#它在测试用例执行完毕并生成测试报告时触发,可以在此处对测试结果进行处理,通过实现该钩子函数来对测试报告进行定制化的处理,例如记录测试用例的执行结果、截图等
def pytest_sessionstart(session):
    session.results = dict()



@pytest.hookimpl(hookwrapper=True)

def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    report.description = str(item.function.__doc__)

    if report.when == 'call':
        item.session.results[item] = report

#在测试套件执行结束后调用(也就是pytest进程结束前,会调用此钩子函数,),可以在此钩子函数中执行清理操作或收集报告等
def pytest_sessionfinish(session):
    # print('run status code:', exitstatus)
    passed_amount = sum(1 for result in session.results.values() if result.passed)
    failed_amount = sum(1 for result in session.results.values() if result.failed)

    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=237361a1-3808-4b23-95e4-631d5a06afb0"



    nowt = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime())
    data = {"msgtype": "markdown",
            "markdown": {
                "content": nowt  +
                           "\n> <font color=\"info\">Passed: " + str(passed_amount) + "</font>"
                                                                                      "\n> <font color=\"warning\">Failed: " + str(
                    failed_amount) + "</font>"
            }
            }
    json_data = json.dumps(data)
    headers = {'Content-Type': 'application/json;charset=UTF-8'}
    r = requests.post(url, json_data, headers=headers)
    # print(r.text)



pytest.ini
# -*- coding: utf-8 -*-
[pytest]
addopts = --html=../report/test_staging.html
console_output_style = classic
junit_suite_name = pytest
junit_logging = no
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
Test_api
# -*- coding: utf-8 -*-
import json
import pytest
import requests
import hashlib
import sys
import os

os.environ['PYTHONIOENCODING'] = 'utf-8'

sys.path.append("..")
from common.ReadExcel import TestExcel,WriteExcel

import logging

logger = logging.getLogger(__name__)

xtoken = ""


def setup_module():
    domain = ''
    url = '%s/api/v1/login' % domain
    str = '888888'
    md5 = hashlib.md5()
    md5.update(str.encode('utf-8'))
    str_md5 = md5.hexdigest()
    data = {"email": "email", "password": str_md5}
    r = requests.post(url, data)
    res = json.loads(r.text)
    global xtoken
    xtoken = res['data']['token']
    return xtoken

def http_req(method,url,data,token):
    headers = {
        'Content-Type':'application/json; charset=utf-8',
        'Authorization': xtoken
    }
    if method == 'post':
        resJson = requests.post(url,data,headers=headers)

    elif method == 'get':
        resJson = requests.get(url,json.loads(data),headers=headers)

    elif method == 'delete':
        resJson = requests.delete(url,headers=headers)
    else:
        resJson = requests.get(url,json.loads(data),headers=headers)

    res = resJson.text

    # logger.add("../logs/file_{time}.log", encoding ="utf - 8")
    # logger.info(resp)
    return resJson.text

def res_content(res):
    if len(res) > 300:
        resp = res[0:299]
    else:
        resp = res
    return resp

from openpyxl import load_workbook
def write_result(file_name,sheet_name,row,column,result):
    workbook = load_workbook(file_name)
    sheet = workbook[sheet_name]
    sheet.cell(row,column).value = result
    workbook.save(file_name)
    workbook.close()
    return True

case_data=TestExcel().get_TestExcel("../data/supdatas.xlsx","staging")  # pro test test2
idss = [" {} ,地址:{} ".format(data["infor"],data["url"]) for data in case_data]


@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()

    # 确保获取的文本内容已经转为UTF-8编码
    docstring = getattr(item.function, '__doc__', '')
    report.description = docstring.encode('utf-8').decode('utf-8')  # 此处假设docstring原本是正确编码的,此处操作可能多余,仅作示例




@pytest.mark.parametrize("test_data", case_data, ids=idss)
def test_pro_api(test_data):
    filename = "../data/supdatas.xlsx"
    # filename = data_file
    run = test_data["run"]
    if run == 1:
        method = test_data["method"]
        url = test_data["url"]
        data = test_data["params"]
        expected = test_data["exp"]
        row = test_data["row"]

        try:
            response = http_req(method, url, json.dumps(data).encode('utf-8'), xtoken)
            print(res_content(response))
            write_result(filename, 'staging', row+1, 8, response)

            assert expected in response, '是否存在期望结果:%s ' % expected
        except Exception as e:
            logger.error(f"Test failed: {e}")
            pytest.fail(str(e))
    else:
        pytest.skip("跳过,不执行")

if __name__ == "__main__":
    pytest.main(["Test_stagingApi.py",   # 测试用例
                 "--html=../report/report.html",   # 生成测试报告 生成assert存放的css文件和html文件
                 "--self-contained-html",  # 把css样式合并到html里 仅生成html文件
                 "--capture=sys"
                 ])

标签:sheet,测试报告,企微,用例,pytest,workbook,import,data,name
From: https://www.cnblogs.com/luckyletop/p/18502141

相关文章

  • 10.23 测试用例
    设计测试用例编写技巧=================================一、查看用例的模板案例模板1:案例模板2:案例3:==========================================二、用例的要素讲解.编写用例的要素?用例编号,用例标题,前置条件,测试步骤,预期结果,优先级(必写)系统名称、模块名称、用例创......
  • 设计测试用例编写技巧_
    一、查看用例的模板二、用例的要素讲解.编写用例的要素?用例编号,用例标题,前置条件,测试步骤,预期结果,优先级(必写)系统名称、模块名称、用例创建时间,实际结果,用例类型,执行时间,执行状态等(非必填项)三、详解测试用例要素(一)用例编号可以称为:用例id,测试编号,编号等(1)系统命名_模块名......
  • 编写测试用例技巧
    设计测试用例编写技巧一、查看用例的模板二、用例的要素讲解.编写用例的要素?用例编号,用例标题,前置条件,测试步骤,预期结果,优先级(必写)系统名称、模块名称、用例创建时间,实际结果,用例类型,执行时间,执行状态等(非必填项)=============================================三、详解测......
  • pytest用例管理
    pytest用例管理1.安装pipinstallpytest2.编写2.1编写规则用例文件:所有文件名以test_开头用例类:测试文件中每个Test开头的类就是一个测试用例类测试用例:测试类中每一个以test开头的方法就是一个测试用例2.2函数形式编写测试用例deftest_demo():assert100==......
  • UML之用例图详解
    ~犬......
  • 功能测试的用例评审需要关注哪些环节
    功能测试的用例评审需要关注以下环节:一、测试用例的完整性;二、测试用例的一致性;三、测试用例的可行性;四、与需求的对应关系;五、错误和改进建议;六、测试用例的可理解性;七、风险评估。测试用例的完整性即确保测试用例涵盖了所有的功能需求和测试场景。一、测试用例的完整性确保......
  • 第7课—设计测试用例方法之白盒测试法(了解)
    白盒测试技术(1)白盒测试(也叫结构测试或者逻辑驱动测试)定义:白盒测试也叫透明盒测试,检查程序内部结构及路径一是否符合规格说明,二是否符合其代码规范。(2)白盒测试常见方法:a.语句覆盖;b.判断覆盖(也称“分支覆盖”);c.条件覆盖;d.判断、条件覆盖;e.条件组合覆盖;f.路径覆盖(分为......
  • 第6课 测试用例设计
    1.黑盒测试方法2.白盒测试方法术语一:•动态测试(dynamictesting):通过运行软件的组件或系统来测试软件•静态测试(statictesting):对组件的规格说明书进行评审,对静态代码进行走查•正式评审(formalreview):对评审过程及需求文档的一种特定评审•度量(metric):测量所使用......
  • 第6课—设计测试用例方法之场景法(重要)
    场景法(1)定义:场景法主要是针对测试场景类型的,顾也称场景流程分析法(2)流程分析:是将软件系统的某个流程看成路径,用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合,使得流程的各个分支都能走到案例:1》人事考勤系统:离职流程有哪些?2》网购商品流程有哪些?(3)熟悉xmind思......
  • 测试用例的方法
    测试用例的方法一、黑盒设计测试用例方法1、等价类,边界值,判定表,因果图,正交表,场景法,状态迁移法2、错误推测法,异常分析法,随机测试二、白盒测试设计用例方法1、语句覆盖2、判断覆盖3、条件覆盖4、判断条件覆盖5、路径覆盖(独立路径覆盖,z路径)等价类:定义:指某个输入域的集合......