如何参数化单元测试方法

时间:2018-05-24 16:56:13

标签: python unit-testing

我在一个类中包含一组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应用程序上的向导。但是,我希望能够将各种参数传递给testName,projectDescription等测试方法。 使用unittest,如何运行一组可能10次迭代的测试,将不同参数传递给test002_project_wizard_page1?

4 个答案:

答案 0 :(得分:3)

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

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 project

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()

答案 1 :(得分:0)

对我来说,看起来你想在模板下测试,使用不同的参数。代码如下:

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)

答案 2 :(得分:0)

查看Eli Bendersky博客上的Python unit testing: parametrized test cases帖子。它说明了

  

您无法轻易地从外部将参数传递给unittest.TestCase。

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

答案 3 :(得分:0)

你有什么理由不能使用pytest吗?它provides this functionality out of the box