语法要求:

  1. 测试脚本名以test_开头(或以_test结尾也可以)
  2. 测试脚本中若是执行函数,以test_开头
  3. 测试脚本中若是执行一个类中的函数,测试类以Test开头,并且不能带有init方法
  4. 断言使用assert
  5. 执行文件下所有的测试脚本,命令为pytest【cd到对应文件下执行】 或者 pytest 文件名/
  6. 执行文件下指定的测试脚本,命令为pytest -q 指定测试脚本名称【cd到对应文件下执行】 或者 pytest 文件名/脚本名

安装requests库

# --default-timeout=200设置超时时间
pip --default-timeout=200 install requests
# 设置阿里代理
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

python 写测试脚本 pytest脚本_python


pytest 命令行执行

-x选项

Pytest会运行每一个搜索到的测试用例,如果某个测试函数被断言失败,或者触发了外部异常,则该测试用例的运行就会停止,pytest将其标记为失败后继续运行一下测试用例,然而在debug的时候,我们往往希望遇到失败时立刻停止整个会话

测试报告
pip install pytest-html
pytest ./ --html=…/report/first.html

操作数据库

pip --default-timeout=200 install pymysql

代码提交githab

FAQ:

问题1:

pycharm please specify a different SDK name

python 写测试脚本 pytest脚本_python_02


解决方法:

在setting里面的解释器选择里面,打开show all,删除其他多余的环境

python 写测试脚本 pytest脚本_html_03


问题2:

pip安装完requests包后pycharm中仍然不能import requests库


问题3:
No schema supplied. Perhaps you meant
解决:
访问域名时,要写http://域名

参考文章:

from pyecharts.charts import Bar
from pyecharts.charts import Page
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import pandas as pd
from pylab import mpl
from pyecharts.components import Table
from pyecharts.options import ComponentTitleOpts

def get_data_dict():
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 指定默认字体:解决plot不能显示中文问题
    mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

    datas = pd.read_excel(r'C:\Users\Administrator\Desktop\软件需求-2022-11-18.xls')

    FX = pd.read_excel(r'C:\Users\Administrator\Desktop\故障矩阵-2022-11-18.xls')

    # ---------------------------软件需求------------------------------------
    # 软件需求有效需求总数
    req_all_item = len(datas[datas['分类'].str.contains('功能|非功能') & (datas['状态'] != 'rejected')])
    print(req_all_item)

    # 软件需求已向上追溯个数
    req_up_trance = len(
        datas[datas['分类'].str.contains('功能|非功能') & (datas['状态'] != 'rejected') & (datas['追溯状态'].str.contains('up'))])
    print(req_up_trance)
    # 软件需求向上追溯率
    a = (req_up_trance / req_all_item)*100
    re_up_trance_rate = ('%.2f' % a)
    print(re_up_trance_rate)

    # 软件需求已向下追溯个数
    req_down_trance = datas[datas['分类'].str.contains('功能|非功能') & (datas['状态'] != 'rejected')]
    req_down_trance_count = req_down_trance['向下追溯软件架构'].notnull().sum()
    print(req_down_trance_count)

    # 软件需求向上追溯率
    b = (req_down_trance_count / req_all_item)*100
    req_down_trance_rate = ('%.2f' % b)

    print(req_down_trance_rate)

    # ---------------------------故障矩阵------------------------------------

    # 故障矩阵有效需求总数
    fx_all_item = len(FX[FX['分类'].str.contains('功能|非功能') & (FX['状态'] != 'rejected')])
    print(fx_all_item)

    # 故障矩阵已向上追溯个数
    fx_up_trance = len(
        FX[datas['分类'].str.contains('功能|非功能') & (FX['状态'] != 'rejected') & (FX['追溯状态'].str.contains('up'))])
    print(fx_up_trance)
    # 故障矩阵向上追溯率
    c = (fx_up_trance / fx_all_item)*100
    fx_up_trance_rate = ('%.2f' % c)
    print(fx_up_trance_rate)

    # 故障矩阵已向下追溯个数
    fx_down_trance = FX[FX['分类'].str.contains('功能|非功能') & (FX['状态'] != 'rejected')]
    fx_down_trance_count = fx_down_trance['向下追溯软件架构'].notnull().sum()
    print(fx_down_trance_count)

    # 故障矩阵向上追溯率
    d = (fx_down_trance_count / fx_all_item)*100
    fx_down_trance_rate = ('%.2f' % d)
    print(type(fx_down_trance_rate))

    # ------------------绘制追溯符合度簇状图-------------------------
    # 创建软件需求和故障矩阵,追溯符合度dataframe
    re_list = [re_up_trance_rate, req_down_trance_rate]
    fx_list = [fx_up_trance_rate, fx_down_trance_rate]
    pdt_list = ['向上追溯率', '向下追溯率']
    data_dict = {'data': [re_list, fx_list], 'head': ['软件需求', '故障矩阵'], 'item': pdt_list}
    print(data_dict)
    return data_dict


def create_bar(bar_dict):
    # 建立百分比的柱状图
    bar_item = bar_dict['item']
    bar_head = bar_dict['head']
    bar_data = bar_dict['data']
    bar = (
        # 实例化一个柱状图
        Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
            # 链式调用
            .add_xaxis(bar_item)
            .set_global_opts(title_opts=opts.TitleOpts(title="追溯情况"))
    )
    for i in range(len(bar_head)):
        bar.add_yaxis(bar_head[i], bar_data[i], label_opts=opts.LabelOpts(formatter="{c} %"))
    bar.set_global_opts(
        yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"), interval=10))
    return bar

def create_table(bar_dict):
    table = Table()

    headers = ["分类", "向上追溯", "向下追溯软件架构"]
    list3 = ["软件需求"]
    list5 = bar_dict['data'][0]
    list1 = list3 +list5
    list4 = ["故障矩阵"]
    list6 = bar_dict['data'][1]
    list2 = list4 + list6
    rows = [
        list1,
        list2
    ]
    print('111111111111',rows)
    table.add(headers, rows)
    table.set_global_opts(
        title_opts=ComponentTitleOpts(title="Table-基本示例")
    )
    table.render("table_base.html")
    return table

if __name__ == "__main__":
    data = get_data_dict()
    bar = create_bar(data)
    bar.render('bar_render.html')
    data1 = get_data_dict()
    bar1 = create_bar(data1)
    bar1.render('bar1_render.html')
    table1 = create_table(data)
    table1.render("table_base.html")
    page = Page(layout=Page.DraggablePageLayout)
    page.add(bar, bar1, table1)
    page.render('all_render.html')
    Page.save_resize_html('all_render.html', cfg_file='chart_config.json', dest='new_all_render.html')