如何参数化单元测试方法



我在单个类中包含一组python/selenium/unittest测试:

class TestProject(unittest.TestClass):
def test001_create_project(self):
...
def test002_project_wizard_page1(self, projectName, projectDescription):
....
def test003_project_wizard_page2(self):
....
def test004_project_wizard_finish(self):
....

我需要按上述顺序在块中运行测试方法,因为它们在我的 Web 应用程序上演练向导。但是,我希望能够将各种参数传递给测试方法,如项目名称、项目描述等。 使用 unittest,如何运行一组可能 10 次迭代的测试,将不同的参数传递给test002_project_wizard_page1?

编号测试实际上只是单个测试的一部分。定义为单独测试的是使用参数集的函数。

class TestProject(unittest.TestCase):
def _create_project(self):
...
def _page1(self, projectName, projectDescription):
...
def _page2(self):
...
def _finish(self):
...
def _run(self, name, descr):
self._create_project()
self._page1(name, descr)
self._page2()
self._finish()
def test001(self):
self._run("foo", "do foo")
def test002(self):
self._run("bar", "do bar")
# etc

一个可以减少一些样板的有趣模块是ddt项目。

import ddt
@ddt.ddt
class TestProject(unittest.TestCase):
def _create_project(self):
...
def _page1(self, projectName, projectDescription):
...
def _page2(self):
...
def _finish(self):
...
@ddt.data(
("foo", "do foo"),
("bar", "do bar"),
# etc
)
@ddt.unpack
def test_run(self, name, descr):
self._create_project()
self._page1(name, descr)
self._page2()
self._finish()

你不能使用 pytest 的任何原因?它提供了开箱即用的功能。

对我来说,看起来您想在模板下使用不同的参数进行测试。像下面这样的代码怎么样:

import unittest

class TestProject(unittest.TestClass):
def mytest001_create_project(self):
...
def mytest002_project_wizard_page1(self, projectName, projectDescription):
....
def mytest003_project_wizard_page2(self):
....
def mytest004_project_wizard_finish(self):
....
def mytest_in_order(self, project_name, project_description):
self.mytest001_create_project()
self.mytest002_project_wizard_page1(project_name, project_description)
self.mytest003_project_wizard_page2()
self.mytest004_project_wizard_finish()
def test_in_batch(self):
project_names = ['a', 'b']
project_descriptions = ['aa', 'bb']
for project_name, project_description in zip(project_names, project_descriptions):
self.mytest_in_order(project_name, project_description)

看看 Python 单元测试:参数化测试用例在 Eli Bendersky 的博客上发布的文章。它指出

您不能轻松地将参数传递到单元测试中。来自外部的测试用例。

但是,它提供了可用于向unittest.TestCase类添加参数的class ParametrizedTestCase(unittest.TestCase)实现。这将解决您的参数问题,我相信,每个单独的测试方法已经按顺序运行。

最新更新