新手区 请教一下,python3+unittest 进行接口测试,如何解决 case 之间数据的依赖关系呢?

119 · 2018年09月30日 · 最后由 119 回复于 2018年10月08日 · 1761 次阅读

如题,unittest 中的 case 数据有依赖关系:
例如:case001 新增了一名用户,返回值中会包含一个 id 号
在 case002 中删除 case001 中新增的用户,需要用到返回的 id 号,我的代码如下


class Shiyi_test(unittest.TestCase):

    def setUp(self):
        print("*" * 90)
        self.url = "http://www.baidu.com"
        self.headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",}

    def tearDown(self):
        print("*" * 90)

    # 新增用户:
    def test_001_add(self):
        payload = {"Name": 119, "mobile": 119}
        r = requests.post(url=self.url, data=json.dumps(payload), headers=self.headers)
        print(r.json())
        return r.json()['id']

    # 删除用户
    def test_002_del(self):
        d = Shiyi_test.test_001_add()
        print(d)

if __name__ == '__main__':
    unittest.main()

问题出现在第二条 case:
1.直接运行的话,会报错

TypeError: test_001_add() missing 1 required positional argument: 'self'

2.如果在 d = Shiyi_test.test_001_add(self) 加入 self,可以获取 id 值,但是 case002 实际上把 001 新增用户又执行一遍,系统里面就会出现两个用户。
麻烦请教一下,这个错误在哪里呢?具体该怎么传递这一个数值呢?谢谢

PS:查数据库直接获取 id 号是一种方法。想问问,不查数据库,直接靠代码的方式怎么实现呢?

最后,祝大家节日快乐哈!!!

共收到 6 条回复 时间 点赞

case2 里继承一下 id,或者这俩 case 合并成一个就行了,先注册,然后直接删除

119 #2 · 2018年09月30日 Author
我去催饭 回复

写到一个是可以的。那继承的话,该怎么写呢 ?麻烦了

举个例子,你们调接口的时候不是要签名么?你要有一个签名生成的算法吧?return 的签名带到你的接口请求参数里,这就和你的问题场景非常相似了,一样的道理。具体的代码,我忘啦😂

case 应该要相互独立啊,而且,根据我的理解,你的第二个 case 的 id 可以直接从数据库里面取啊,干嘛要依赖其它用例呢?

首先确保 case 命令是可以按顺序的。
r.json()['id'] 写在函数里,函数在往 test_001_add(self) 里面插入。
然后赋予 1 个类方法里可以访问到的对象变量=函数 ()
下个 case 函数里 使用这个对象变量 就行了。

ps:方法是局部的在栈里面,方法生命周期结束后就快回了,把方法返回的结果指向 1 个对象,当这个对象让其他方法可以访问到,就可以上下文使用。

119 #6 · 2018年10月08日 Author

case 是独立的,但是业务操作的时候数据是有逻辑关系的。目前的方法就是在数据库查询该内容 id 的,就是想学习一下不用数据库,直接用脚本的方法。

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