Тестване на единици с Python unittest модул

Никой добър разработчик не внедрява код без задълбочено тестване. Единичното тестване е процес на тестване на отделните модули на голяма програма.

Тази статия ще обсъди как можете да извършите модулно тестване на вашия код с помощта на модула Python unittest. Първо, нека разберем какви са видовете тестове.

Когато става въпрос за тестване, има ръчно тестване и автоматично тестване. Ръчното тестване е техника за тестване, при която хората извършват теста ръчно след завършване на разработката. Автоматизираното тестване е техника за тестване, при която програмите извършват теста автоматично и ни дават резултатите.

Щяхте да разберете, че ръчното тестване отнема време и е трудно за изпълнение. И така, разработчиците пишат код за извършване на тестове (автоматично тестване). Има различни видове тестване в автоматизираното тестване. Някои от тях са модулно тестване, интегриращо тестване, крайно тестване, стрес тестване и др.,

Нека видим стандартния поток на тестване.

  • Напишете или актуализирайте кода.
  • Напишете или актуализирайте тестове за различни случаи за вашия код.
  • Изпълнете тестовете (или ръчно, или с помощта на програма за тестване).
  • Вижте резултатите от теста. Ако има грешки, поправете ги и повторете стъпките.

Тук ще обсъдим най-важния и основен тип тестване, наречен тестване на единици. Без повече шум, нека се потопим в същинския урок.

Какво е Unit Testing?

Единичното тестване е техника за тестване на малък блок от независим код. Малкоблоковият код ще бъде функция в повечето случаи. Думата независим означава, че не зависи от други части от код в проекта.

Да кажем, че трябва да проверим дали даден низ е равен на “pctechbg.net” или не. За това сме написали функция, която приема един аргумент и връща дали е равен на “pctechbg.net” или не.

def is_equal_to_geekflare(string):
	return string == "pctechbg.net"

Горната функция няма зависимости от друг код. Така че можем да го тестваме независимо, като даваме различни входове. Независимата част от кода може да се използва в целия проект.

Значение на модулното тестване

Като цяло кодът на независимите блокове може да се използва в целия проект. Така че трябва да е добре написано и тествано. Единичните тестове са тестовете, използвани за тестване на тези видове независими блокове код. Какво се случва, ако не използваме модулни тестове за нашия проект?

  8 най-добрия софтуер за управление на журнали за по-бързо отстраняване на неизправности

Да приемем, че не сме тествали малки блокове код, които се използват в целия проект. Всички други тестове като интеграционни тестове, тестове от край до край и т.н., използващи другите малки блокове код, може да са неуспешни. Това нарушава приложението. Ето защо основните градивни елементи на кода трябва да бъдат тествани добре.

Сега знаем значението на модулното тестване и писмените модулни тестове за всички независими кодови блокове. Тъй като сме извършили единични тестове, други тестове като интеграционни тестове, тестове от край до край и т.н. няма да се провалят поради независимия блок от кодове.

В следващите раздели ще видим какво представлява модулът unittest на Python и как използваме модула unittest за писане на модулни тестове в Python.

Забележка: Предполагаме, че сте запознати с Python класове, модули и т.н. Ако не сте запознати с междинните концепции на Python като класове, модули и т.н., може да ви е трудно да разберете следващите раздели.

Какво е Python unittest?

Python unittest е вградена тестова рамка за тестване на код на Python. Разполага с тестов инструмент, който ни позволява да изпълняваме тестовете без много усилия. Така че можем да използваме вградения модул unittest за тестване, без да използваме модулите на трети страни. Но той се променя в зависимост от вашите изисквания. Вграденият модул unittest е добър, за да започнете с тестване в Python.

Трябва да следваме стъпките по-долу, за да тестваме кода на Python с помощта на модула unittest.

#1. Напишете кода.

#2. Импортирайте модула unittest.

#3. Създайте файл, започвайки с ключовата дума test. Например test_prime.py. Ключовата дума test се използва за идентифициране на тестовите файлове.

#4. Създайте клас, разширяващ класа unittest.TestCase.

#5. Напишете методи (тестове) вътре в класа. Всеки метод съдържа различни тестови случаи въз основа на вашите изисквания. Трябва да именуваме метода, започвайки с ключова дума test.

#6. Изпълнете тестовете. Можем да проведем тестовете по различни начини.

  • Изпълнете командата python -m unittest test_filename.py.
  • Изпълняваме тестовите файлове като общи файлове на Python с командата python test_filename.py. За да работи този метод, трябва да извикаме основния метод на unittest в тестовия файл.
  • И накрая, използването на Discover. Можем да стартираме автоматично тестовете с помощта на командата python -m unittest discover без да споменаваме името на файла на теста. Той ще намери тестовете, използвайки конвенцията за именуване, която следвахме. Така че трябва да именуваме нашите тестови файлове с ключовата дума test в началото.
  Топ 21 най-добри алтернативи на Adobe InDesign

Обикновено при тестване сравняваме изхода на кода с очаквания изход. И така, за сравняване на изходите unittest предоставя различни методи. Можете да намерите списъка с функции за сравнение тук.

Можете лесно да ги разберете без никакви затруднения. Те са директни.

Това е много теория. Сега трябва да влезем в кодирането.

Забележка: Ако имате някакви въпроси относно модула unittest, можете да отидете на документация и изчисти съмненията си. Без допълнително забавяне, нека използваме модула unittest.

Единични тестове в Python с помощта на unittest

Първо ще напишем някои функции и след това ще се съсредоточим върху писането на тестовете. Първо отворете папка в любимия си редактор на кодове. И създайте файл, наречен utils.py. Поставете следния код във файла.

import math


def is_prime(n):
    if n < 0:
        return 'Negative numbers are not allowed'

    if n <= 1:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


def cubic(a):
    return a * a * a


def say_hello(name):
    return "Hello, " + name

Имаме три различни функции във файла utils.py. Сега трябва да тестваме всяка функция с различни тестови случаи. Нека напишем тестовете за първата функция is_prime.

#1. Създайте файл с име test_utils.py в примерната папка като utils.py.

#2. Импортирайте модула utils и unittest.

#3. Създайте клас с името TestUtils, разширяващ unittest.TestCase клас. Името на класа може да бъде всяко. Опитайте се да дадете на класа смислено име.

#4. Вътре в класа напишете метод, наречен test_is_prime, който приема себе си като аргумент.

#5. Напишете различни тестови случаи с аргументи към is_prime и сравнете изхода с очаквания изход.

#6. Примерен тестов случай self.assertFalse(utils.is_prime(1)).

#7. Очакваме изходът на is_prime(1) да бъде false в горния случай.

#8. Подобно на горния случай, ще направим различни тестови случаи въз основа на функцията, която тестваме.

Да видим тестовете.

import unittest

import utils


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        self.assertFalse(utils.is_prime(4))
        self.assertTrue(utils.is_prime(2))
        self.assertTrue(utils.is_prime(3))
        self.assertFalse(utils.is_prime(8))
        self.assertFalse(utils.is_prime(10))
        self.assertTrue(utils.is_prime(7))
        self.assertEqual(utils.is_prime(-3),
                         "Negative numbers are not allowed")


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

Ние извикваме основния метод на модула unittest, за да изпълним тестовете, използвайки командата python filename.py. Сега, изпълнете тестовете.

  Каква е разликата между PST и OST файловете на Outlook?

Ще видите резултата, подобен на този по-долу.

$ python test_utils.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Сега опитайте да напишете тестовите случаи и за други функции. Измислете различни случаи за функциите и напишете тестове за тях. Разгледайте следните тестове, които са добавени към горния клас.

...


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        ...

    def test_cubic(self):
        self.assertEqual(utils.cubic(2), 8)
        self.assertEqual(utils.cubic(-2), -8)
        self.assertNotEqual(utils.cubic(2), 4)
        self.assertNotEqual(utils.cubic(-3), 27)

    def test_say_hello(self):
        self.assertEqual(utils.say_hello("pctechbg.net"), "Hello, pctechbg.net")
        self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
        self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
        self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")


...

Използвахме само някои от функциите за сравнение от модула unittest. Можете да намерите пълния списък тук.

Научихме как да пишем модулни тестове с помощта на модула unittest. Сега е време да видите различни начини за провеждане на тестовете.

Как да изпълнявате тестове с помощта на unittest

Вече видяхме начин за изпълнение на тестовите случаи в горния раздел. Нека видим другите два начина за изпълнение на тестовете с помощта на модула unittest.

#1. Използване на името на файла и модула unittest.

В този метод ще използваме модула unittest и името на файла, за да изпълним тестовете. Командата за изпълнение на тестовете е python -m unittest filename.py. В нашия случай командата за изпълнение на тестовете е python -m unittest test_utils.py.

#2. Използване на метода за откриване

Ще използваме метода за откриване на модула unittest, за да открием автоматично всички тестови файлове и да ги стартираме. За да открием автоматично тестовите файлове, трябва да ги наименуваме, започвайки с ключовата дума test.

Командата за изпълнение на тестовете с помощта на метода за откриване е python -m unittest discover. Командата ще открие всички файлове, чиито имена започват с test и ще ги изпълни.

Заключение 👩‍💻

Единичните тестове са основно тестване в света на програмирането. Има много други тестове в реалния свят. Опитайте се да ги научите един по един. Надявам се този урок да ви помогне да пишете основни тестове в Python с помощта на модула unittest. Има библиотеки на трети страни като pytest, Robot Framework, nose, nose2, slash и т.н. Можете да ги изследвате въз основа на изискванията на вашия проект.

Приятно тестване 😎

Може също да се интересувате от Въпроси и отговори за интервю за Python.