写点什么

unittest 使用 parameterized 参数化后如何调用添加到测试套件中

作者:虫无涯
  • 2023-02-20
    陕西
  • 本文字数:1635 字

    阅读完需:约 5 分钟

写了一个 Unittest+Python+execl 的一个接口自动化,在参数化的时候遇到了一个问题。具体的“坑”如下

要实现的需求

在 execl 中涉及或写接口测试用例,然后读取 execl 中每一行的数据,每一行数据就相当于一条用例

需求实现

path = "F:\InterFace_JIA1\dataconfig\source_user_case.xlsx"params_list = TestRunCase(path).get_params()print("params_list:",params_list)
class TestRun(unittest.TestCase): #params_list = [(2, 100000, 100001),(1, 100000, 100003)] @parameterized.expand(params_list) # 这里参数化了params_list def test_run(self, name, expect_res, actual_res): self.assertEqual(expect_res, actual_res)
if __name__ == '__main__': unittest.main()
复制代码


用例为:

结果为:

先不管接口是不是有问题,从这个运行看,流程是 OK 的

参数化后调用加入测试条件中

if __name__ == '__main__':    suite = unittest.TestSuite()    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')    filename = "./report/" + now + '_result.html'    fp = open(filename, 'wb')    suite.addTest(TestRun('test_run'))    runner = HTMLTestRunner.HTMLTestRunner(        stream=fp,        title=u'测试结果',        description=u'全部测试用例')    runner.run(suite)    fp.close()    time.sleep(2)    print("sdasdasdasdasdasdsa")
复制代码

结果出错

TypeError: 'NoneType' object is not callable


排查分析

使用 unittest.defaultTestLoader.discover,打印所有的 case,发现用例格式是“test_run_0”


<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<main.run.TestRun testMethod=test_run_0>, <main.run.TestRun testMethod=test_run_1>]>]>
复制代码


if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover('./', pattern='run.py') for case in suite: print (case)
复制代码

重新调用

把 test_run 改成 test_run_0


if __name__ == '__main__':    suite = unittest.TestSuite()    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')    filename = "./report/" + now + '_result.html'    fp = open(filename, 'wb')    suite.addTest(TestRun('test_run_0'))    runner = HTMLTestRunner.HTMLTestRunner(        stream=fp,        title=u'测试结果',        description=u'全部测试用例')    runner.run(suite)    fp.close()    time.sleep(2)    print("sdasdasdasdasdasdsa")
复制代码


仍然报错:提示“test_run_0”找不到

再次分析

发现如图,使用 suite = unittest.defaultTestLoader.discover('./', pattern='run.py')即可,直接去掉 suite.addTest(TestRun('test_run_0'))


再次调试

结果就 OK 了


class TestRun(unittest.TestCase):    #params_list = [(2, 100000, 100001),(1, 100000, 100003)]    @parameterized.expand(params_list)    def test_run(self, name, expect_res, actual_res):        self.assertEqual(expect_res, actual_res)        #print(actual_res)        #self.assertTrue(True, actual_res)
if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover('./', pattern='run.py') # for case in suite: # print (case) # suite = unittest.TestSuite() now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') filename = "./report/" + now + '_result.html' fp = open(filename, 'wb') #suite.addTest(TestRun('test_run_0')) runner = HTMLTestRunner.HTMLTestRunner( stream=fp, title=u'测试结果', description=u'全部测试用例') runner.run(suite) fp.close() time.sleep(2) print("sdasdasdasdasdasdsa") #sendmain(filename, mail_to=['zhangbo@novastar.tech'])
复制代码



发布于: 2023-02-20阅读数: 25
用户头像

虫无涯

关注

专注测试领域各种技术研究、分享和交流~ 2019-12-11 加入

CSDN测试领域优质创作者 | CSDN博客专家 | 阿里云专家博主 | 华为云享专家 | 51CTO专家博主

评论

发布
暂无评论
unittest使用parameterized参数化后如何调用添加到测试套件中_Python_虫无涯_InfoQ写作社区