【pytest】(十二)参数化测试用例中的setup和teardown要怎么写?

还是一篇关于pytest的fixture在实际使用场景的分享。

fixture我用来最多的就是写setup跟teardown了,那么现在有一个用例是测试一个列表接口,参数化了不同的状态值传参,来进行测试。

那么对于这个用例的setup跟teardown,我就要在setup里插入不同状态的测试数据,并且在测试完成后,在teardown里清除掉插入的数据。

一、setup

不过在插入数据的时候,我不想要一次性的把所有状态的数据都插入进去。比如1,2,3,4,5 有5个状态的参数,我想执行1的时候,插入状态
1的数据,测试完成后,删除刚才插入的这条数据,后面以此类推。

那么,这里还是要用到参数传递的一个效果了,这个在之前的文章里也讲过,有兴趣可以去看下,这里不再赘述。

@pytest.fixture(params=[1, 2, 3, 4, 5])
def init_allot_task_status(request):
    status = request.param
    db = DB()
    insert_allot_task_sql = """
    INSERT INTO purchase_allot (`id`, `allot_sn`... )
    """.format(10000086, status)
    db.exec_sql(insert_allot_task_sql)
    yield status #这里把参数给出去,供测试用例使用
    delete_sql = "DELETE from sm_purchase_allot WHERE id = {}".format(10000086)
    print("执行delete-sql:", delete_sql)
    db.exec_sql(delete_sql)
    db.close()

yield之前,其实做的就是插入数据,并且通过yield把request.param拿到的参数给出去,给测试用例使用。

二、teardown

yield之后,则就是删除之前插入的数据了,这里我为了方便,插入的测试数据id取了一个单独的,所以删除的时候直接删除这个id的数据即可。

再来看一下测试用例

def test_allot_list_query_by_status(init_allot_task_status):
    """
    测试不同状态的列表查询
    在fixture中做了参数化
    1-待处理、2-处理中、3-已发货、4-已完成、5已取消
    """
    payload = {"status": init_allot_task_status} # 因为fixture中的yield做了参数的返回,这里可以直接使用
    r = requests.post(QA_URL + API_URL, json=payload, headers=HEADER)
    result = r.json()

    assert result["result"] == "ok"
    assert result["errmsg"] == "success"
    assert result["row"]["taskListOfPage"]["resultData"][0]["status"] == init_allot_task_status # 因为fixture中的yield做了参数的返回,这里可以直接使用

将fixture init_allot_task_status传入测试case中,这样的话 在case执行的时候会先执行fixture方法,而fixture在执行的时候,则会进行参数化,并且把每次使用的参数
返回给测试case,供测试用例发起请求,断言等使用。

三、执行测试

执行测试用例,可以看到最终的运行过程:
【pytest】(十二)参数化测试用例中的setup和teardown要怎么写?
参数分别执行,并且在对应测试用例的开始跟结尾做好测试数据的插入和删除工作。

上一篇:cypress 从文件中读取数据 fixture


下一篇:Pytest测试框架(三):pytest fixture 用法