引言
前面的文章介绍了如何在 Python 的 Unittest 框架中来使用 ddt 实现数据驱动的自动化测试。
在了解了 ddt 的使用后,你是否有过如下疑问:
-
ddt 是如何把你的测试数据转换传给你的测试用例?
-
当你的一组数据有多个参数时,ddt 是如何 unpack 的?
-
当你有多组数据时,ddt 拆分测试用例是如何命名的?
主题:今天分享的内容是--探索 ddt 实现数据驱动的秘密。
通过阅读ddt 源码,我们不难发现其实 ddt 的实现核心就是@ddt(cls)这个装饰器,而这个装饰器的核心代码是 wrapper这个类函数,下面我直接把 wrapper 的源码贴上来,大家一起看看:
def wrapper(cls):
# 先遍历被装饰类的name, 和func
# 对于func,先看被装饰的是DATA_ATTR还是FILE_ATTR
for name, func in list(cls.__dict__.items()):
# 如果被装饰的是DATA_ATTR
if hasattr(func, DATA_ATTR):
#获取@data提供数据的index和内容并且遍历它们
for i, v in enumerate(getattr(func, DATA_ATTR)):
# 重新生成新的测试函数名,这个函数名会展示在测试报告中
test_name = mk_test_name(
name,
getattr(v, "__name__", v),
i,
fmt_test_name
)
test_data_docstring = _get_test_data_docstring(func, v)
# 如果类函数被@unpack装饰
if hasattr(func, UNPACK_ATTR):
# 如果提供的数据是tuple或者list
if isinstance(v, tuple) or isinstance(v, list):
# 则添加一个case到测试类中
# list或tuple传不定数目的值, 用*v即可。
add_test(
cls,
test_name,