Home  >  Article  >  Backend Development  >  How Can I Implement Dynamic Unit Testing with Parameterization in Python?

How Can I Implement Dynamic Unit Testing with Parameterization in Python?

Linda Hamilton
Linda HamiltonOriginal
2024-11-23 20:52:13807browse

How Can I Implement Dynamic Unit Testing with Parameterization in Python?

Dynamic Unit Testing in Python with Parameterization

Introduction

Parametrization is a technique in unit testing that automates the creation of tests with different sets of input data. This allows developers to thoroughly test their code with various scenarios, ensuring its robustness and reliability.

Parametrizing with pytest's Decorator

One popular option for parametrization is using pytest's decorator. Simply add the @parametrize decorator to your test class, followed by a list of values as follows:

from pytest import mark

class TestSequence(unittest.TestCase):

    @mark.parametrize(
        ["name", "a", "b"],
        [
            ["foo", "a", "a"],
            ["bar", "a", "b"],
            ["lee", "b", "b"],
        ]
    )
    def test_sequence(self, name, a, b):
        self.assertEqual(a, b)

This decorator will automatically generate a separate test for each set of values in the list.

Parametrizing with parameterized Library

Another option is to use the parameterized library. Here's how the same test would look using this library:

from parameterized import parameterized

class TestSequence(unittest.TestCase):

    @parameterized.expand([
        ["foo", "a", "a"],
        ["bar", "a", "b"],
        ["lee", "b", "b"],
    ])
    def test_sequence(self, name, a, b):
        self.assertEqual(a, b)

In both cases, the result is the same: multiple tests are generated based on the provided data, allowing you to test your code thoroughly.

Original Approach for Parameterization

While the methods described above are modern and widely used, there was an older approach that generated test methods dynamically. However, this approach is no longer commonly used and is mentioned for historical reasons only:

import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequense(unittest.TestCase):
    pass

def test_generator(a, b):
    def test(self):
        self.assertEqual(a,b)
    return test

if __name__ == '__main__':
    for t in l:
        test_name = 'test_%s' % t[0]
        test = test_generator(t[1], t[2])
        setattr(TestSequense, test_name, test)
    unittest.main()

The above is the detailed content of How Can I Implement Dynamic Unit Testing with Parameterization in Python?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn