Python 用 Python 写了测试脚本,但一直在报错:TypeError: __init__() missing 2 required positional arguments: 'b' and 'expected'

小刘 · April 25, 2019 · Last by 陈恒捷 replied at April 25, 2019 · 6038 hits


这个是数学类,是父类

这个是测试数学类,是子类

这个是执行类

这个是 Excel 类

运行测试数学类的时候报错了 ,想问下各位大佬怎么解决,找了
百度但是都不行

共收到 2 条回复 时间 点赞
小刘 #1 · April 25, 2019 Author

谢谢大家

可以把整个项目上传 github 后,把 github 地址发下不?

代码太多了,看起来比较费劲,而且好像不是很全。

光从图片上看,我估计是由于 TestAdd 这个类重写了 unittest.TestCase 的 init 方法引起的。倒不是说重写这种方式不对,但它的重写里做了 2 个和父类方法不同的修改:
1、父类原来是一个 method_name 是第一个参数,重写后变成了最后一个参数
2、父类的 method_name 是可选参数,会有 'runTest' 这个默认值,但子类继承后变成了 4 个必须参数

因此,用调用父类的初始化方法一样的方式去调用子类,是调不通的。从你堆栈上看,你用的是 pycharm 自带的 runner ,而非你代码里用的 HtmlTestRunner ,自带的 runner 估计按照 unittest.TestCase 的写法,只传了一个参数,不满足子类重写后要求传 4 个参数的要求,所以报错信息里会说少了后面 3 个参数。

如果要更正让它兼容,可以试试
1、 TestAdd 里面的 def __init__(self, a, b, expected, MethodName): 换成 def __init__(self, MethodName='runTest', a=None, b=None, expected=None)
2、执行类中的用例初始化方法从 TestAdd(item[0], item[1], item[2], 'add') 改为 TestAdd(a=item[0], b=item[1], expected=item[2], MethodName='add')

PS:不知道你学习的是什么课程,但这种继承 unittest.TestCase 后改写 init 方法并且参数数量、位置不一样的写法,还是第一次见,应该是属于一种不大专业的写法,而且参数名用了首字母大写的驼峰命名,也不符合 python 的专业命名方法(全部字母小写且用下划线分隔)。基于 unittest.TestCase 做扩展应该用类似于 https://blog.csdn.net/qq_41963758/article/details/80366507 里面的方法,只增加可选参数,不增加或改变必须参数,这样才能保证对父类的操作对子类也继续适用。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up