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

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

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

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

Ouroboros 回复

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

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

zhang 回复

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

Eric Zhang 回复

好的 感谢大佬,有思路了

KinChung 回复

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

如果只是想解除用例的依赖,可以封装一个 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
大概如此,也可以有别的方法,欢迎讨论

zhang 关闭了讨论 05月26日 14:32
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册