项目场景:
使用@minium.ddt_case数据驱动测试
问题描述
在使用@minium.ddt_case的数据驱动时,生成的用例名称会把参数值全部拼接到用例名称后面,这样就导致,当参数过多时,用例名称会很长,有时候参数里面包含特殊字符串,甚至会导致无法生成测试报告,从而导致用例执行异常,下面是运行以下代码后生成的测试报告中显示的用例名称
from business_test.cases.base.basecase import BaseCase
from business_test.cases.pages import loginpage
from business_test.cases.base import router, accounts
import minium
@minium.ddt_class()
class LoginPageTest(BaseCase):
def __init__(self, methodName='runTest'):
super(LoginPageTest, self).__init__(methodName)
self.loginPage = loginpage.LoginPage(self)
@minium.ddt_case(
(0, '登录失败-账号/密码错误', 'aiyumei', '200'),
(1, '登录成功-账号:aiyumei', accounts.user, accounts.password)
)
def test_login(self, args):
if self.app.current_page.path == router.loginPage:
paths = [router.loginPage, router.homePage]
self.loginPage.login(user=args[2], password=args[3])
self.page.wait_for(3)
self.assertEqual(paths[args[0]], self.mini.app.current_page.path, msg=args[1])
elif self.app.current_page.path == router.homePage:
pass
原因分析:
发现返回的测试名称test_name将用例名称+参数的name+序号+传入参数的值
解决方案:
有两种解决方案
1、修改源码
test_name = name_fmt % {
"testname": testname,
"name": name,
"index": index,
"value": value,
}
该方法比较直接粗暴,将源码中
test_name = name_fmt % {
"testname": testname,
"name": name,
"index": index,
"value": "",
}
生成的用例名称如下图,只会在用例名称后加上序号,比较简短:
但是使用这种方式,测试用例名称中无法直观地看出该用例的测试目的
2、@miniun.ddt_class中testNameFormat参数设置格式化规则
使用minium.ddt_class修饰测试类时,带上testNameFormat参数设置格式化规则, 可配置项目包括:
%(index)s
%(value)s
%(name)s
其中 %(index)s 必须存在,不配置则默认加上。
一些例子:
下面的代码,先在@minium.ddt_class中配置testNameFormat=“%(name)s”,然后在用例修饰器@minium.ddt_case中添加minium.ddt_data方法,注意minium.ddt_data只能传两个参数,第一个是用例的传入参数,第二个就是@minium.ddt_class中配置testNameFormat的格式化规则(该例中为name)
from business_test.cases.base.basecase import BaseCase
from business_test.cases.pages import loginpage
from business_test.cases.base import router, accounts
import minium
@minium.ddt_class(testNameFormat="%(name)s")
class LoginPageTest(BaseCase):
def __init__(self, methodName='runTest'):
super(LoginPageTest, self).__init__(methodName)
self.loginPage = loginpage.LoginPage(self)
@minium.ddt_case(
minium.ddt_data((0, '登录失败-账号/密码错误', 'aiyumei', '200'), name='登录失败'),
minium.ddt_data((1, '登录成功-账号:aiyumei', accounts.user, accounts.password), name='登录成功')
)
def test_login(self, args):
if self.app.current_page.path == router.loginPage:
print('args的值为多少呢', args)
paths = [router.loginPage, router.homePage]
self.loginPage.login(user=args[2], password=args[3])
self.page.wait_for(3)
self.assertEqual(paths[args[0]], self.mini.app.current_page.path, msg=args[1])
elif self.app.current_page.path == router.homePage:
pass
运行后,查看测试报告中用例名称,如下图