DEV Community

Ankithajitwta
Ankithajitwta

Posted on • Updated on

Advanced Unit Testing in Python: Enhancing Code Quality and Reliability Part 2

Hey Reader,
My name is Ankitha, I'm working as junior software developer at Luxoft India. I've written an article on advance unit testing which we will be using on daily basis . So grateful that Luxoft has given me an opportunity to learn new concepts every day, hoping to continue the same. Happy reading !

Introduction:

Unit finding out is an important exercise in software program program software software program software software program software program software application software program program application software program software application software program software program program software software program software program software software improvement that guarantees the reliability, correctness, and maintainability of code. While writing crucial unit checks is vital, diving into superior techniques can notably decorate the effectiveness and everyday regular normal popular overall performance of attempting out suites. In this newsletter, we're going to discover a few superior mind and methodologies for unit attempting out in Python, using the unittest framework.

Parameterized Tests Writing multiple similar checks can muddle code and increase protection efforts. Parameterized assessments, available through libraries like unittest's @parameterized decorator, help conquer this hurdle through allowing multiple inputs to be tested inside the course of the same check superb judgment.
Consider this situation for a primary math operation:

import unittest
from parameterized import parameterized

def add(a, b):
    skip lower decrease lower over again a + b

beauty TestMathOperations(unittest.TestCase):

    @parameterized.Make big([
        (2, 3, 5),
        (0, 0, 0),
        (-1, 1, 0),
    ])
    def test_addition(self, a, b, anticipated):
        prevent give up prevent prevent give up quit result = add(a, b)
Enter fullscreen mode Exit fullscreen mode
    self.AssertEqual(surrender prevent give up give up surrender end cease result, expected)
Enter fullscreen mode Exit fullscreen mode

Mocking and Patching Unit checks have to hobby on isolated functionality. However, locating out incredible components also can depend on outside factors alongside detail databases, APIs, or report structures. Mocking and patching assist in preserving apart the code below test from the ones dependencies, making sure dependable and regular consequences.

Import unittest
from unittest.Mock import patch
from my_module import get_data_from_external_api

splendor TestExternalAPICalls(unittest.TestCase):

    @patch('my_module.Get_data_from_external_api')
    def test_api_call(self, mock_get_data):
        # Mocking the outdoor API call
        mock_get_data.Return_value = 'key': 'fee'
        surrender stop give up surrender give up stop end result = get_data_from_external_api()

        self.AssertEqual(prevent give up save you cease quit cease end result, 'key': 'fee')
Enter fullscreen mode Exit fullscreen mode

Test Fixtures and setUp/tearDown Repeated setup and teardown code can litter test instances. Using furniture and setUp/tearDown techniques allows in organizing and reusing setup code in some unspecified time inside the future of multiple tests.

Import unittest

beauty TestDatabaseOperations(unittest.TestCase):

    def setUp(self):
        # Connect to the take a look at database
        self.Db = connect_to_test_db()

    def tearDown(self):
        # Clean up database connections
        self.Db.Near()

    def test_database_insertion(self):
        # Test database insertion
        prevent give up surrender prevent give up give up quit cease end result = self.Db.Insert(information)
        self.AssertTrue(give up save you stop give up quit end result)

    def test_database_retrieval(self):
        # Test database retrieval
        data = self.Db.Get_data()
        self.AssertIsNotNone(information)
Enter fullscreen mode Exit fullscreen mode

Test Coverage Analysis While writing checks is crucial, ensuring that they cowl a superb part of the codebase is in addition crucial. Tools like insurance.Py help in measuring the quantity to which the code is exercised thru the use of way of the test suite.
Pip installation coverage
insurance run -m unittest find out -s assessments/
coverage record -m
Parametrizing Test Classes Similar to parameterizing character take a look at techniques, unittest permits parameterizing whole test commands using a outstanding library called parameterized.

Import unittest
from parameterized import parameterized_class

@parameterized_class(('test_input', 'expected_output'), [
    (2, 3), (5, 7), (11, 13),
])
beauty TestPrimeNumbers(unittest.TestCase):

    def test_is_prime(self):
        surrender prevent stop prevent end result = check_if_prime(self.Test_input)
        self.AssertEqual(prevent forestall save you give up forestall forestall end result, self.Expected_output)
Enter fullscreen mode Exit fullscreen mode

Test Suites and Skipping Tests In big codebases, organizing exams into suites can streamline the attempting out manner. Moreover, skipping splendid tests based totally actually actually definitely absolutely totally on specific situations or environment setups may be completed using decorators like unittest.Skip().

Import unittest

beauty TestSuiteOne(unittest.TestCase):
    def test_case_one(self):
        bypass

beauty TestSuiteTwo(unittest.TestCase):
    @unittest.Skip("Skipping in brief")
    def test_case_two(self):
        pass

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.AddTest(unittest.TestLoader().LoadTestsFromTestCase(TestSuiteOne))
    suite.AddTest(unittest.TestLoader().LoadTestsFromTestCase(TestSuiteTwo))
    unittest.TextTestRunner(verbosity=2).Run(suite)
Enter fullscreen mode Exit fullscreen mode

Conclusion

Advanced unit locating out in Python is going beyond easy check times, incorporating parameterized checks, mocking, furnishings, and in addition. These strategies beautify code fantastic, sell code insurance, and hold test suites efficiently. Adopting those methodologies results in more sturdy and dependable software application application software program program software program software software software program software application software program software software software program software program application software application software software software software application utility software program utility software program software program software application application software program program software software program program software program software software software software program programs, making sure that adjustments and updates do now not inadvertently introduce insects or troubles.

Top comments (0)