前言
面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果【response】,给用例b使用【body】。
unittest框架的每个用例都是独立的,测试数据共享的话,需设置全局变量,可以使用globals()函数来解决。
globals()函数
globals() 函数会以字典类型返回当前位置的全部全局变量。【同个模块所有的全局变量字典】
print(globals()) # 用法 globals()["a"] = "用例a的返回结果" # 用例b引用 b = globals()["a"] print(b)
unittest框架用例
使globals()函数实现用例之间的数据共享,比如用例a返回的结果写到globals()["a"]中,用例b调用globals()["a"]的值。
import unittest import requests class TestA(unittest.TestCase): def setUp(self): self.s = requests.session() def test_a(self): '''用例a''' result_a = "aaaaaa" # 用例a的返回值 # 返回值先给全部办理,存到字典对应key globals()["a"] = result_a self.assertEqual(result_a, "aaaaaa") def test_b(self): '''用例b''' b = globals()["a"] # 引用用例a的返回值 print("用例b引用用例a的返回值:%s"%b) result_b = b+"111" self.assertEqual(result_b, "aaaaaa111") if __name__ == '__main__': unittest.main()
运行结果:
E:\python36\python.exe D:/jiekou9/debug/yilai.py .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK 用例b引用用例a的返回值:aaaaaa
但是这样会有个隐患:用例b是用来用例a的,所以用例有先后顺序,用例a先执行,用例b后执行。【接口业务场景用例:上个接口的响应报文作为下一个接口的请求报文入参】
globals()优化
当用例c的的请求参数依赖用例a和用例b时,使用太多的globals()会不太好关联,可以把globals()函数放到setUp前置里面,如下:
用例c需要依赖a的返回值result_a和用例b的返回值result_b。
import unittest import requests
class TestA(unittest.TestCase): '''上海悠悠:QQ群:779429633''' def setUp(self): self.s = requests.session() self.g = globals() def test_a(self): '''用例a''' result_a = "aaaaaa" # 用例a的返回值 # 返回值先给全部办理,存到字典对应key self.g["a"] = result_a self.assertEqual(result_a, "aaaaaa") def test_b(self): '''用例b''' b = self.g["a"] # 引用用例a的返回值 print("用例b引用用例a的返回值:%s"%b) result_b = b+"111" self.g["b"] = result_b self.assertEqual(result_b, "aaaaaa111") def test_c(self): '''用例c''' print("用例c依赖用例a和用例b") c_a = self.g["a"] c_b = self.g["b"] print("用例c的请求入参:%s" % c_a) print("用例c的请求入参:%s" % c_b) if __name__ == '__main__': unittest.main()
运行结果:
.用例b引用用例a的返回值:aaaaaa .用例c依赖用例a和用例b 用例c的请求入参:aaaaaa 用例c的请求入参:aaaaaa111 . ---------------------------------------------------------------------- Ran 3 tests in 5.001s OK