自动化工具 求教如何优化 pytest 的前置条件的处理逻辑设计

老曹 · 2022年07月15日 · 最后由 紫藤Ivy 回复于 2022年08月04日 · 8292 次阅读

最近公司有个项目,是要使用 pytest 进行自动化测试平台搭建,在做用户管理功能的测试用例编写时,遇到了一个问题,用例中有两个过程完全一样的 case,只是前置条件不同,一个是正常创建,一个是在用户已存在的情况下创建用户,我想用 pytest 的 fixture 来解决这个问题,但是发现 fixture 的最小 scope 是 function,而我的两个用例都是用的同一个 testcase 来执行的,那么 pytest 就无法分别为两个用例执行不同的前置。

所以,我就把执行不同前置的逻辑写到了 testcase 里,代码如下:

def test_creatUser(userManager,creatUser_data):
    logger.info("=========================创建用户-" + creatUser_data.get('DESC') + "用例-开始执行=========================")
    pre = creatUser_data.get('PRE')
    userName = creatUser_data.get('username')
    if pre == 'isExistUser=false': #期望用户不存在则执行下面的方法
        isUserExist(userName, False)
    elif pre == 'isExistUser=true':#期望用户存在则执行下面的方法
        isUserExist(userName, True)

    password=creatUser_data.get('password')
    role = creatUser_data.get('role')
    res=creatUser_data.get('RES')
    assert SystemManager.createUser(userName, password, role) == res
    logger.info("=========================创建用户-" + creatUser_data.get('DESC') + "用例-执行结束=========================")

isUserExist() 的逻辑是这样:

def isUserExist(username : str, isExist : bool):
    line = Common.queryLineForName('users', 'User_ID', username)
    if line >= 1 and isExist == False:                             #如果用户已存在且期望用户不存在则删除用户
        Common.excSQL(delete sql)
        logger.info("删除用户" + username)
    elif line == -1 and isExist == True:                           #如果用户不存在且期望用户存在则新增用户
        Common.excSQL(insert sql)
        logger.info("新建用户" + username)
    elif line >= 1 and isExist == True:                            #如果用户存在且期望用户存在则什么都不做
        logger.info("期望用户" + username + "已存在")
    if line == -1 and isExist == False:                            #如果用户不存在且期望用户不存在则什么都不做
        logger.info("期望用户" + username + "已删除")

这样虽然能解决问题,但是总感觉不太对,不知道 pytest 或者有其他插件能否结局我这个问题,请各位大佬能给点意见。

共收到 7 条回复 时间 点赞

以下仅为个人理解

是不是你要创建一个不存在的用户,然后在创建一个相同的用户?

如果是这样的话,不妨试试就写一个创建用户的用例,然后让这个用例执行两遍呢?

pip install pytest-repeat
@pytest.mark.repeat(2)
def test_create_user():
  # 执行创建用户操作

不知道我理解对不对

谢谢大佬的答复,但是这样不适用我的情况,在测试前我是不知道系统里有没有这个用户的,如果有的话,第一个用例就是 fail 掉了

这种简单的场景 在执行第二个用例前在库里插一条用户记录就行了 跑完后再删掉

这种水平是不是离自动化平台还有点距离!

这种场景可以考虑使用参数化 parameter 实现,
使用变量获取不同场景(已存在用户,不存在用户),然后将这个变量(两种场景)使用参数化传进共同的操作函数,就会执行两遍哦,希望能帮助到你

小小鱼儿 回复

前置条件确实是存在 json 里通过 parameter 传进来的,两个测试用例数据除了 isUserExist 外全部一致,但是因为想将用例逻辑写得更灵活一点,所以还是要做各种情况的判断

感觉有点不对劲

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册