接口测试 在实际项目测试中,自动化测试和功能测试是隔离的,不同模块用例之间的依赖怎么处理呢?

zhang · 2023年05月14日 · 最后由 LTDDDD 回复于 2023年05月19日 · 7812 次阅读

在实际项目测试中,功能测试主要负责业务测试,产品迭代、回归测试等,自动化测试主要将用例转化为自动化并提供测试工具等,这样情况下,可以一个自动化测试项目下有很多个不同的模块,每个模块的负责测试又不一样,在跑自动化测试的时候,每个模块需要单独跑自己的自动化就行,但是有时候模块之间又是相互依赖的,那怎么在执行模块自动化用例的时候,自动去发现依赖的用例并执行呢?
举个实际的场景如下:
业务模块 A --->测试 A ,业务模块 B --->测试 B, 业务模块 C --->测试 C,其中 模块 B 依赖模块 A, 模块 C 依赖模块 A 和模块 B,简单的自动化测试如下:

在执行模块 A 的时候只需要执行 TestAAA,但是执行模块 B 的时候,需要先执行 TestAAA.test_a, 怎么去自动发现并执行呢?

全局变量

# global_data.py 

class GlobalData:
    hello = "world"
    num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    user = {"name": "admin", "age": 23, "city": "shanghai"}

模块 A 测试用例


from global_data import GlobalData


class TestAAA:
    def setup_class(self):
        print("\nTestAAA测试用例,setup_class中只执行一次\n")

    def teardown_class(self):
        print("\nTestAAA测试用例,teardown_class中只执行一次\n")

    def test_demo(self):
        print("这个是TestAAA的test_demo用例")

    def test_a(self):
        print("这个是测试用例AAA")
        setattr(GlobalData, "token", "securt_token")
        print("全局变量:", GlobalData.__dict__)

模块 B 测试用例

from global_data import GlobalData

class TestBBB():
    def setup_class(self):
        print("\nTestBBB测试用例,setup_class中只执行一次\n")

    def teardown_class(self):
        print("\nTestBBB测试用例,teardown_class中只执行一次\n")

    def test_demo(self):
        print("这个是TestBBB的test_demo用例")

    def test_b(self):
        print("这个是测试用例BBB")
        token = getattr(GlobalData, "token")
        print("token=", token)
        setattr(GlobalData, "order_id", 123456)
        print("全局变量:", GlobalData.__dict__)

模块 C 测试用例

from global_data import GlobalData

class TestCCC:
    def setup_class(self):
        print("\nTestCCC测试用例,setup_class中只执行一次\n")

    def teardown_class(self):
        print("\nTestCCC测试用例,teardown_class中只执行一次\n")

    def test_demo(self):
        print("这个是TestCCC的test_demo用例")

    def test_c(self):
        print("这个是测试用例CCC")
        token = getattr(GlobalData, "token")
        order_id = getattr(GlobalData, "order_id")
        print("token=", token)
        print("order_id=", order_id)
        print("全局变量:", GlobalData.__dict__)

目前想实现的需求如下:
1、测试 A 需要执行 模块 A 的测试用例的时候,执行 pytest -vs test_AAA.py 此时用例 TestAAA 正常执行

2、测试 B 需要执行 模块 B 的测试用例的时候,执行 pytest -vs test_BBB.py 此时用例 TestAAA --->TestBBB 正常执行

3、测试 C 需要执行 模块 B 的测试用例的时候,执行 pytest -vs test_CCC.py 此时用例 TestAAA --->TestBBB --->TestCCC 正常执行

那么 怎么处理这个模块间的依赖呢? 想到可以全部导入模块的用例,但是在执行模块 B 的用例的时候模块 A 的用例不一定全部执行,只需要部分就行

最后一个问题:
测试 A 执行完用例后,测试报告都是 TestAAA 的结果,
测试 AB 执行完用例后,测试报告都是 TestBBB 的结果,
测试 C 执行完用例后,测试报告都是 TestCCC 的结果,
因为测试 C 只负责模块 C 的测试,并不需要知道模块 A 和模块 B 的测试结果,,所以测试报告只需要模块 TestCCC 的结果就行,
那么 怎么在测试报告中忽略这种呢?

共收到 7 条回复 时间 点赞
zhang 关闭了讨论 05月26日 14:32

如果只是想解除用例的依赖,可以封装一个 api 层,api 层写业务,testcase 层调 api
比如 api:
def func1():
res = requets.post(xxx)
return res

testcase:
import func1
def test001:
res = func1()
assert res.status_code == 200
大概如此,也可以有别的方法,欢迎讨论

KinChung 回复

意思是把获取 cookie 单独抽离出来,放在 fixture 中实现吗? 或者 单独的模块? 那么 业务模块 ABC 的自动化执行的时候,单独的 cookie 模块的用例也会执行吗?最后测试报告中是否展示 cookie 怎么加开关呢? 有代码示例可以参考吗?

Eric Zhang 回复

好的 感谢大佬,有思路了

zhang 回复

需要解除依赖的,自动化测试的设计应满足 AIR 原则:Automatic(自动化)、Independent(独立性)、Repeatable(可重复),用例之间互相依赖肯定不会是一个好的实践方式,后续的维护成本会很高。建议将公共依赖的业务模块部分(一般是用来构造数据的)抽出,作为公共的模块调用

看了下楼主的需求,跟我们之前跑 UI 自动化的时候拿 cookie 的强依赖有点像,因为分环境,所以我们必须拿 cookie 才能继续执行,那代表拿 cookie 的操作属于各个模块的强依赖,所以我们单独抽出一个模块,专门分配给存在这种强关联的用例。
剩下的,比如 ABC 模块,只专注剩下的业务,至于测试报告中是否展示这个拿 cookie 的过程,在获取 cookie 函数里配置开关就好了,不知道我们组的思路符不符合楼主的需求

Ouroboros 回复

但是 做成自动化后,用例有依赖额,需要解除这个依赖吗?

业务逻辑是业务逻辑,用例是用例。A 调 B,调的是 B 的逻辑,把业务逻辑和校验分开就行。

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