как параметризировать тестовые методы unittest - PullRequest
0 голосов
/ 24 мая 2018

У меня есть набор тестов 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):
        ....

Мне нужно запустить методы тестирования в блоке в указанном выше порядке, потому что они проходят через мастер намое веб-приложение.Однако я хочу иметь возможность передавать различные параметры в методы тестирования, такие как projectName, projectDescription и т. Д. Используя unittest, как я могу запустить набор из 10 итераций тестов, передающих разные параметры, в test002_project_wizard_page1?

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

По какой причине вы не можете использовать pytest?Он предоставляет эту функциональность из коробки .

0 голосов
/ 24 мая 2018

Ваши пронумерованные тесты - это всего лишь части одного теста.То, что вы должны определить как отдельные тесты, - это функции, которые используют ваши наборы параметров.

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()
0 голосов
/ 24 мая 2018

Взгляните на модульное тестирование Python: параметризованные тесты сообщение в блоге Эли Бендерского.В нем говорится, что

Вы не можете легко передать аргументы в unittest.TestCase извне.

Однако он предоставляет реализацию для class ParametrizedTestCase(unittest.TestCase), которую можно использоватьдобавить параметры в класс unittest.TestCase.Это решит проблему с вашими параметрами, и я считаю, что каждый отдельный метод тестирования уже выполняется по порядку.

0 голосов
/ 24 мая 2018

Для меня, похоже, вы хотите протестировать по шаблону, с другими параметрами.Как насчет кодов, подобных следующему:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...