最近公司有个项目,是要使用 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 或者有其他插件能否结局我这个问题,请各位大佬能给点意见。


↙↙↙阅读原文可查看相关链接,并与作者交流