昌邑市住房和建设局网站,网站建设与维护课程设计,固安县城乡和住房建设局网站,百度seo技术优化在复杂的测试场景中#xff0c;常常会存在用例依赖#xff0c;以一个接口自动化平台为例#xff0c;依赖关系#xff1a;
创建用例 -- 创建模块 -- 创建项目 -- 登录。
用例依赖的问题
• 用例的依赖对于的执行顺序有严格的要求#xff0c;比如让被依赖的方…在复杂的测试场景中常常会存在用例依赖以一个接口自动化平台为例依赖关系
创建用例 -- 创建模块 -- 创建项目 -- 登录。
用例依赖的问题
• 用例的依赖对于的执行顺序有严格的要求比如让被依赖的方法先执行。
• 一旦使用用例依赖依赖的用例就无法单独执行了按照用例的设计原则每条用例都应该独立执行。
正确的做法
我们应该将依赖的操作封装成方法调用。如果能通过装饰器实现调用那就很有趣了。
aomaker[1] 提供了这种装饰器的实现seldom 进行了复刻只是用法上有所不同。
类内部方法调用
我们可以在测试类下面创建普通的方法。然后通过dependent_func()装饰器调用他。
import seldom
from seldom.testdata import get_md5
from seldom.utils import cache, dependent_funcclass DependentTest(seldom.TestCase):staticmethoddef user_login(username, password):模拟用户登录获取登录tokenreturn get_md5(usernamepassword)dependent_func(user_login, usernametom, passwordt123)def test_case(self,):sample test casetoken cache.get(user_login)print(token, token)if __name__ __main__:seldom.main(debugTrue)cache.clear()说明
这个例子涉及到不少知识点。
1.test_case() 用例依赖 user_login() 方法通过 dependent_func() 装饰器调用 user_login 方法。
2.user_login() 方法运行的时候需要参数username、password可以直接在 dependent_func() 装饰器中设置参数username“tom”、 password“t123”。
3.user_login() 方法运行运行完会生成 token, 保存于 cache中通过 cache.get() 可以获取到token, 默认通过方法名user_login 作为key获取。
4.为了简化代码生成token 是通过 get_md5() 根据传入的参数生成的一个 md5 值。
5.cache.clear() 用于清空缓存 再次调用 user_login() 方法直接不执行应为cache已经有上次的执行结果了。
执行日志
python zzz_demo.py
...
test_case (zzz_demo.DependentTest.test_case)
sample test case ... 2023-11-15 23:26:36 | INFO | dependence.py | test_case depends on user_login, execute.
2023-11-15 23:26:36 | INFO | cache.py | Set cache data: user_login 35e0ff9c4cba89998dda8255d0eb5408
2023-11-15 23:26:36 | INFO | cache.py | Get cache data: user_login 35e0ff9c4cba89998dda8255d0eb5408
token 35e0ff9c4cba89998dda8255d0eb5408
ok----------------------------------------------------------------------
Ran 1 test in 0.005sOK
2023-11-15 23:26:36 | SUCCESS | runner.py | A run the test in debug mode without generating HTML report!
2023-11-15 23:26:36 | INFO | cache.py | Clear all cache data外部类方法依赖
•创建依赖方法
# common.py
from seldom.testdata import get_md5class Login:staticmethoddef account_login(username, password):模拟用户密码登录获取登录tokenreturn get_md5(usernamepassword)loginLogin()•用例引用依赖方法
import seldom
from seldom.utils import cache, dependent_func
from common import Login # 方式1引用依赖类
# from common import login # 方式2引用初始化好的类对象class DependentTest(seldom.TestCase):dependent_func(Login().account_login, key_nametoken1, usernametom, passwordt123)# dependent_func(login.account_login, key_nametoken1, usernametom, passwordt123)def test_case(self):Used tuple test datatoken cache.get(token1)print(token, token)if __name__ __main__:seldom.main(debugTrue)说明
1.Common 类的account_login()方法可以不设置为静态方法导入时需要类需要加括号Common().user_login。 或者先初始化类对象loginLogin() 再调用。
2.key_name 指定缓存的 key如果指定为token1, 从缓存读取也使用这个cache.get(“token1”)。
多重方法依赖
复杂的场景当然是需要多重依赖的。
1.被依赖的方法可以进一步使用 dependent_func()装饰器进行多重复依赖。
查询模块 -- 查询项目 -- 登录
# common.py
from seldom.testdata import get_md5, get_int
from seldom.utils import cache, dependent_funcclass Login:staticmethoddef account_login(username, password):模拟用户密码登录获取登录tokenreturn get_md5(usernamepassword)class DepFunc:staticmethoddependent_func(Login.account_login, key_nametoken, usernamejack, password456)def get_project_id():token cache.get(token)print(f使用token:{token} 查询项目, 返回项目ID)return get_int(1, 1000)staticmethoddependent_func(get_project_id, key_namepid)def get_module_id():pid cache.get(pid)print(f使用项目ID:{pid} 查询模块, 返回模块ID)return get_int(1, 1000)在用例中直接调用 DepFunc.get_module_id 方法即可。
import seldom
from seldom.utils import cache, dependent_func
from common import DepFuncclass DependentTest(seldom.TestCase):dependent_func(DepFunc.get_module_id, key_namemid)def test_case(self):sample test casemid cache.get(mid)print(f模块ID: {mid})if __name__ __main__:seldom.main(debugTrue)cache.clear()2.测试用例也可以同时使用多个 dependent_func() 装饰器依赖多个方法顺序由上到下执行这种方式主要用于被依赖的方法之间没有依赖关系。
# common.py
from seldom.testdata import get_int, usernameclass DataFunc:staticmethoddef get_name():return username(languagezh)staticmethoddef get_age():return get_int(1, 99)在用例中使用多个dependent_func()依赖装饰器。
import seldom
from seldom.utils import cache, dependent_func
from common import DataFuncclass DependentTest(seldom.TestCase):dependent_func(DataFunc.get_name, key_namename)dependent_func(DataFunc.get_age, key_nameage)def test_case(self):sample test casename cache.get(name)age cache.get(age)print(f名字: {name}, 年龄: {age})if __name__ __main__:seldom.main(debugTrue)cache.clear()参数化使用
参数化 data()、 file_data() 是seldom最重要的功能之一能否和 dependent_func() 一起使用 当然可以。
import seldom
from seldom import data
from seldom.testdata import get_md5
from seldom.utils import cache, dependent_funcclass DependentTest(seldom.TestCase):staticmethoddef user_login(username, password):模拟用户登录获取登录tokenreturn get_md5(usernamepassword)data([(case1, foo),(case2, bar),])dependent_func(user_login, usernametom, passwordt123)def test_case(self, _, keyword):Used tuple test datatoken cache.get(user_login)print(keyword, token, token)if __name__ __main__:seldom.main(debugTrue)cache.clear()说明
1.data() 装饰器必须写在 dependent_func() 的上面。
2.运行两条用例user_login() 被执行过一次后第二次则不需要重复执行直接返回结果。 总结
感谢每一个认真阅读我文章的人
作为一位过来人也是希望大家少走一些弯路如果你不想再体验一次学习时找不到资料没人解答问题坚持几天便放弃的感受的话在这里我给大家分享一些自动化测试的学习资源希望能给你前进的路上带来帮助。 软件测试面试文档
我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。 视频文档获取方式 这份文档和视频资料对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你以上均可以分享点下方小卡片即可自行领取。