0

Let's say I have following classes:

check.py:

class Build:
    def __init__(self, url):
        self.url = url
        self.parameters = {}


class Job:
    def __init__(self, builds):
        self.builds = []
        for build in builds:
            self.builds.append(build)

    def builds_filter(self, builds_filter_func):
        self.builds = [build for build in self.builds if builds_filter_func(build)]


def build_filter_according_to_name(job, name):
    job.builds_filter((lambda build: build.parameters.get("NAME", "") == name))


if __name__ == '__main__':
    job = Job([Build(url="url1"), Build(url="url3"), Build(url="url3")])
    build_filter_according_to_name(job, "FOO")

I'd like to test in a unittest file the method build_filter_according_to_name, with different sets of parameters in each build. How do I do it?

For example:

  • A Job object with 5 builds, 1 of them has "NAME" == "foo".
  • A Job object with 5 builds, 4 of them has "NAME" == "foo".

etc.

Do I have to loop over self.builds before each test, and assign the parameters for each build, like this?

test_check.py:

import unittest

from test.check import Job, Build, build_filter_according_to_name

NAME = "FOO"


class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.job = Job([Build(url="url1"), Build(url="url3"), Build(url="url3")])

        self.parameters = {
            "NAME": "NAME",
            "FOO": "BAR"
        }

    def init_params(self, number_of_foo_names=0):
        for build in self.job.builds:
            parameters = self.parameters.copy()
            if number_of_foo_names > 0:
                parameters["NAME"] = "FOO"
                number_of_foo_names -= 1
            build.parameters = parameters

    def test_one_name_foo(self):
        self.init_params(number_of_foo_names=1)
        build_filter_according_to_name(self.job, name=NAME)
        self.assertEqual(len(self.job.builds), 1)

    def test_two_names_foo(self):
        self.init_params(number_of_foo_names=2)
        build_filter_according_to_name(self.job, name=NAME)
        self.assertEqual(len(self.job.builds), 2)


if __name__ == '__main__':
    unittest.main()

Or is there a better way to achieve it?

user2653179
  • 393
  • 1
  • 6
  • 21
  • Does this answer your question? [How do you generate dynamic (parameterized) unit tests in Python?](https://stackoverflow.com/questions/32899/how-do-you-generate-dynamic-parameterized-unit-tests-in-python) – MrBean Bremen Nov 28 '22 at 15:41

0 Answers0