基于pytest编写自动化用例

1.项目目录结构

├─configs   //项目配置文件,一般存放一些数据库链接,接口地址等配置
├─models    //存放用例所需要的数据
├─testcases //测试用例
├─utils //通用工具
├─requirements.txt  //项目虚拟环境配置

2.编写测试用例时,需要将文件命名为test_*.py开头,基于函数编写测试用例,函数必须也以test*.py开头

def test_1(mysql_utils,setup_func):
    '''
    测试不存在的数据库商品
    :param mysql_utils:
    :param setup_func:
    :return:
    '''
    url = API_URL + "100101"
    response = requests.get(url)
    //具体断言
    assert response.status_code == 404
    assert response.text == "CAMPAIGN NOT FOUND"

3.在接口测试中,许多前置代码每一个用例都可能会用到,如开启数据库连接或清理数据。如果重复编写该代码的话会浪费很多时间,因此,我们引出了setUp与tearDown的思想。

  1. setUp:每条case执行前会运行该函数
  2. tearDown:每条用例执行后会运行该函数
  3. 在pytest中,可以使用@pytest.fixture()这个装饰器在函数,其声明该函数是fixtrue,即其包含了setUp与tearDown的思想。
  4. yield关键字上面的是setUp,他会在每条用例执行前执行上面的代码。一般我们会用来创建每条用例共同使用的代码,如数据库连接。
  5. yield关键字下面的是tearDown,他会在每条用例执行后执行下面的代码。一般我们会用来销毁数据,如每条用例执行都需要向数据库插入数据,所以一般我们使用该代码去清理数据库的数据。
  6. 使用fixtrue修饰后的函数,如果想在每条用例使用的话,必须在定义用例时,将fixtrue修饰的函数放在参数中。如果想使用setUp返回的对象,可以直接在用例中的形参进行调用
@pytest.fixture(scope='module')     //模块级别,即在该py文件下所有用例执行前后只会执行一次
def mysql_utils():
    dbManager = DbManager()
    return dbManager
 
@pytest.fixture(scope='function')   //函数级别,即在该py文件下,每个用例函数执行前后会执行一次
def setup_func(mysql_utils):
    print('\nset up')
    sql1 = "delete from campaign_campaign"
    sql2 = "delete from campaign_countrycloakconfig"
    mysql_utils.edit(sql2)
    mysql_utils.edit(sql1)
    yield
    print("\ntera_down")
 
def test_1(mysql_utils,setup_func):
    '''
    测试不存在的数据库商品
    :param mysql_utils:
    :param setup_func:
    :return:
    '''
    url = API_URL + "100101"
    response = requests.get(url)
    assert response.status_code == 404
    assert response.text == "CAMPAIGN NOT FOUND"

[email protected]()的作用范围

  1. fixture有4个作用范围,分别是session > module > class > function,默认function级别。
  2. function:每个用例执行时,都会调用一次该函数
  3. class:一个类里面的用例执行时,只执行一次
  4. module:一个py文件中的用例执行时,只执行一次
  5. session:同目录下,每一个py文件中的用例执行时,只执行一次

5.pytest实现数据驱动

  1. 在编写自动化代码时,可能存在一些用例代码逻辑具有高度的重复性,为了提高代码的复用性,我们可以使用数据驱动去编写测试用例
  2. 数据驱动本质上就是把代码与用例数据(断言数据,insert数据库数据,请求数据等)分开,使自动化代码解耦的一个过程,pytest实现数据驱动,主要使用装饰器@pytest.mark.parametrize,常用存放用例数据的格式有json,py,excel,mysql,mongo等
@pytest.mark.parametrize(("case_data"),datacase)    //datacase参数为一个list,case_data即list里面的一个object,当list里面存在n个obj使,便会调用n次该用例函数
def test_06(f_func,db_util,case_data):
    '''
        正常功能用例
    '''
    print("\n用例数据:\n" + json.dumps(case_data, ensure_ascii=False))
    data = case_data["data"]
    body = case_data["body"]
    result = case_data["result"]
    code = case_data["code"]
    for i in data:
        db_util.execute(sql.insert_sql(i))
    response = requests.post(url=promote_query,headers=header,json=body)
    assert response.status_code == 200
    r = response.json()
    assert r["code"] == code
    assert r["body"] == result

 

你可能感兴趣的:(个人学习)