Python unittest – unit test example

Vandaag zullen we leren over Python unittest en voorbeelden bekijken van programma’s met Python unit tests. In de vorige tutorial hebben we geleerd over de python zip-functie.

Python unittest

De Python unittest-module wordt gebruikt om een ​​eenheid van broncode te testen. Stel dat je je project moet testen. Je weet wat voor soort gegevens de functie zal retourneren. Na het schrijven van veel code, moet je controleren of de uitvoer correct is of niet. Normaal gesproken doen we dit door de uitvoer af te drukken en deze te vergelijken met het referentie-uitvoerbestand of de uitvoer handmatig te controleren. Om deze moeite te verminderen, heeft Python de unittest-module geïntroduceerd. Met behulp van deze module kun je de uitvoer van de functie controleren met wat eenvoudige code. In deze tutorial zullen we de basisprincipes van het gebruik van de Python unittest-module bespreken en enkele Python unit testcases schrijven om de functies van een klasse te testen.

Voorbeeldbron van Python Unit Test

Allereerst moeten we wat code schrijven om ze te unit testen. We zullen een Python klasse hebben. Het hoofddoel van de klasse is om de naam van een persoon op te slaan en op te halen. Dus, we schrijven set_name() functie om de gegevens op te slaan en get_name() functie om de naam van de klasse op te halen.

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return 'There is no such user'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('User Abbas has been added with id ', person.set_name('Abbas'))
    print('User associated with id 0 is ', person.get_name(0))

We noemen het klassebestand Person.py. En de output van de bovenstaande code zal er als volgt uitzien.

$ python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

Python unittest structuur

Nu, laten we leren hoe te coderen voor unit testing. Een individuele testcase wordt gecreëerd door te subclassen unittest.TestCase. Door het overschrijven of toevoegen van passende functies, kunnen we logica toevoegen om te testen. De volgende code zal slagen als a gelijk is aan b.

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

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

Hoe python unittest module te draaien

Als je PyCharm IDE gebruikt, kun je eenvoudig ctrl+shift+F10 indrukken om de unittest-module uit te voeren. Anders kun je de opdrachtprompt gebruiken om deze module uit te voeren. Bijvoorbeeld, we hebben het bestand voor unit-testing genoemd als Basic_Test.py. Dus het commando om python unittest uit te voeren zal zijn: $python3.6 -m unittest Basic_Test.Testing Als je de uitvoer uitgebreid wilt zien, dan zal het commando zijn: $python3.6 -m unittest -v Basic_Test.Testing Door PyCharm te gebruiken, krijgen we de onderstaande uitvoer.

Python Unit Test Resultaat & Basisfuncties

Deze unittest heeft 3 mogelijke resultaten. Ze worden hieronder vermeld:

  1. OK: Als alle testgevallen slagen, wordt OK weergegeven.
  2. Fout: Als een van de testgevallen mislukt en een AssertionError-uitzondering veroorzaakt.
  3. Fout: Als een andere uitzondering dan AssertionError wordt veroorzaakt.

Er zijn verschillende functies onder de unittest-module. Ze worden hieronder vermeld.

Method Checks that
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIs(a,b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

Voorbeeld van een Python unit test

Nu is het tijd om unit tests te schrijven voor onze bronklasse Person. In deze klasse hebben we twee functies geïmplementeerd – get_name() en set_name(). Nu zullen we die functies testen met behulp van unittest. Dus we hebben twee testcases ontworpen voor die twee functies. Bekijk de volgende code, je zult het gemakkelijk begrijpen.

import unittest

# Dit is de klasse die we willen testen. Dus we moeten deze importeren
import Person as PersonClass


class Test(unittest.TestCase):
    """
    The basic class that inherits unittest.TestCase
    """
    person = PersonClass.Person()  # instantiate the Person Class
    user_id = []  # variable that stores obtained user_id
    user_name = []  # variable that stores person name

    # test case-functie om de Person.set_name-functie te controleren
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # initialiseer een naam
            name = 'name' + str(i)
            # sla de naam op in de lijstvariabele
            self.user_name.append(name)
            # krijg de gebruikers-id verkregen uit de functie
            user_id = self.person.set_name(name)
            # controleer of de verkregen gebruikers-id leeg is of niet
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # sla de gebruikers-id op in de lijst
            self.user_id.append(user_id)
        print("user_id length = ", len(self.user_id))
        print(self.user_id)
        print("user_name length = ", len(self.user_name))
        print(self.user_name)
        print("\nFinish set_name test\n")

    # test case-functie om de Person.get_name-functie te controleren
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        Any method that starts with ``test_`` will be considered as a test case.
        """
        length = len(self.user_id)  # total number of stored user information
        print("user_id length = ", length)
        print("user_name length = ", len(self.user_name))
        for i in range(6):
            # als i niet de totale lengte overschrijdt, controleer dan de geretourneerde naam
            if i < length:
                # als de twee namen niet overeenkomen, zal de test case mislukken
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # als de lengte wordt overschreden, controleer dan het bericht van het type 'geen dergelijke gebruiker'
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # begin de unittest.main()
    unittest.main()

Merk op dat de unittest-module de testfuncties uitvoert in de volgorde van hun naam, niet in de volgorde waarin ze zijn gedefinieerd. En aangezien we willen dat onze set_name-test als eerste wordt uitgevoerd, hebben we onze testcasefuncties genoemd als test_0_set_name en test_1_get_name.

Voorbeelduitvoer van Python Unit Test

Hieronder zijn afbeeldingen te zien van de output die wordt geproduceerd door ons unit test programma – zowel in de normale modus als in de uitgebreide modus.

$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

Dat is alles over de Python unittest handleiding. Om meer te leren, lees de Officiële Documentatie. Voor verdere vragen kunt u gebruikmaken van het opmerkingenveld. 🙂

Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example