Фреймворки модульного тестирования в Python: эффективное тестирование с помощью unittest

1. Введение

В разработке программного обеспечения модульное тестирование — это метод тестирования, используемый для проверки правильности отдельных компонентов программного обеспечения, таких как функции или методы. Python предоставляет встроенную библиотеку модульного тестирования под названием unittest, которую можно использовать для написания тестового кода, затем запускать тесты и сообщать о результатах тестов.

Эта статья покажет вам, как использовать unittestдля написания и запуска модульных тестов. Прочитав эту статью, вы поймете unittestосновы использования , а также то, как использовать unittestметод утверждения и организационную структуру тестового примера в .

2. Основные понятия и методы

В unittest, каждый тестовый набор является unittest.TestCaseэкземпляром , а набор тестовых наборов является набором тестов. Вы можете unittest.TestCaseопределить свои тестовые примеры, реализовав подклассы, а затем создать конкретные тестовые случаи, создав экземпляры объектов этого подкласса.

Вот простой пример, демонстрирующий, как определять и использовать тестовые случаи:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

В приведенном выше коде мы определяем TestStringMethodsкласс, который наследуется от unittest.TestCase. В этом классе мы определяем три метода test_upper: test_isupperи test_split. Эти три метода являются нашими тремя тестовыми примерами.

unittest.TestCaseКласс предоставляет ряд методов утверждения, таких как assertEqual(a, b), assertTrue(x)и assertFalse(x). Эти методы утверждения используются для проверки того, что наш код ведет себя так, как ожидалось.

3. Запустите тест и просмотрите результаты теста

После того, как мы определим тестовые случаи, мы можем запустить эти тестовые случаи и просмотреть результаты тестов. Вы можете unittest.main()запустить все тестовые примеры, выполнив .

В конце приведенного выше кода мы вызываем unittest.main(). Эта функция будет искать все unittest.TestCaseподклассы в текущем модуле, а затем запускать все testметоды, начиная с в этих подклассах.

Когда мы запустим этот код, unittestбудет выведен отчет о тестировании, показывающий результаты каждого тестового примера. Например, если все тестовые случаи пройдены, вы увидите следующий вывод:

....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

4. Использование тестовых загрузчиков и тестовых бегунов

Загрузчик тестов используется для поиска и загрузки тестов, а средство запуска тестов отвечает за выполнение этих тестов и отчет о результатах. Библиотека unittest Python предоставляет нам загрузчики тестов и средства запуска тестов по умолчанию, однако вы также можете настроить их для удовлетворения особых потребностей.

Вот пример, который демонстрирует, как использовать unittest.TestLoaderдля загрузки тестов:

import unittest

class TestStringMethods(unittest.TestCase):

    # ... 前面的内容 ...

def suite():
    suite = unittest.TestSuite()
    loader = unittest.TestLoader()
    suite.addTest(loader.loadTestsFromTestCase(TestStringMethods))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

В этом примере мы сначала создаем unittest.TestLoaderэкземпляр . Затем мы вызываем loadTestsFromTestCaseметод, который загружает TestStringMethodsвсе тесты, определенные в классе. Затем мы добавили эти тесты в набор тестов.

Что касается средства выполнения тестов, класс unittestпредоставляется unittest.TextTestRunnerв качестве средства выполнения тестов по умолчанию. Экземпляры этого класса будут выводить текстовый отчет на консоль. Если вы хотите настроить средство запуска тестов, вы можете unittest.TestRunnerсделать это, расширив класс.

5. Набор тестов

Набор тестов — это набор тестовых случаев или наборов тестов. Он используется для указания unittestтестов, которые необходимо выполнить. Создавая свои собственные наборы тестов, вы можете точно контролировать, unittestкакие тесты выполняются. Ниже приведен пример создания набора тестов и добавления тестовых случаев:

import unittest

class TestStringMethods(unittest.TestCase):

    # ... 与前文相同 ...

def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestStringMethods('test_upper'))
    suite.addTest(TestStringMethods('test_isupper'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

В этом примере мы создаем suiteфункцию, которая создает unittest.TestSuiteэкземпляр, а затем добавляет тестовые случаи в этот экземпляр. В mainэтом разделе мы создаем unittest.TextTestRunnerэкземпляр и вызываем его runметод для запуска набора тестов.

Шесть, методы setUp и tearDown

В дополнение к методам, используемым для тестирования, unittest.TestCaseпредусмотрены два специальных метода: setUpи tearDown. Эти два метода выполняются до и после каждого метода тестирования и могут использоваться для подготовки тестовой среды и очистки ресурсов.

Вот пример использования setUpand :tearDown

import unittest

class TestDatabaseMethods(unittest.TestCase):

    def setUp(self):
        self.conn = create_database_connection()
        self.cur = self.conn.cursor()

    def tearDown(self):
        self.cur.close()
        self.conn.close()

    def test_insert(self):
        self.cur.execute("INSERT INTO employees VALUES (1, 'John')")
        self.cur.execute("SELECT * FROM employees")
        result = self.cur.fetchone()
        self.assertEqual(result, (1, 'John'))

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

В этом примере мы setUpсоздаем соединение с базой данных и курсор в методе и tearDownзакрываем их в методе. Таким образом, мы можем гарантировать, что каждый тестовый метод запускается в чистой среде базы данных.

Семь, unittest.mock: имитация объектов и поведения.

В некоторых случаях может потребоваться заменить некоторые тестируемые объекты или смоделировать определенное поведение. unittest.mockМодули предоставляют Mockкласс и множество других инструментов, которые помогут вам сделать это.

Вот unittest.mockпример использования:

from unittest import TestCase, mock
from my_module import MyObject

class TestMyObject(TestCase):

    @mock.patch('my_module.MyObject')
    def test_my_method(self, MockMyObject):
        obj = MockMyObject()
        obj.my_method.return_value = 42

        assert obj.my_method() == 42
        obj.my_method.assert_called_once()

В этом примере мы использовали unittest.mock.patchдекоратор для замены MyObjectкласса. Затем мы можем управлять поведением этого резервного объекта, например, устанавливать, какие значения возвращают его методы, или проверять правильность вызова его методов.

В целом, среда Python unittestпредоставляет нам мощные и гибкие инструменты для модульного тестирования. Это только unittestверхушка айсберга, есть много других функций, которые ждут вас, чтобы открыть для себя и использовать.

Ниже приводится вспомогательная информация.Для друзей, которые занимаются [тестированием программного обеспечения], это должен быть самый полный и полный склад подготовки.Этот склад также сопровождал меня в самом сложном путешествии.Я надеюсь, что он может помочь и вам!

Апплет интервью по тестированию программного обеспечения

Банк тестовых вопросов по программному обеспечению заполнен миллионами людей! ! ! Кто знает! ! ! Самая полная мини-программа-викторина во всей сети, вы можете использовать свой мобильный телефон, чтобы делать викторины, в метро или в автобусе, сверните его!

Рассматриваются следующие разделы вопросов интервью:

1. Базовая теория тестирования программного обеспечения, 2. Веб, приложение, функциональное тестирование интерфейса, 3. Сеть, 4. База данных, 5. Linux

6. веб, приложение, автоматизация интерфейса, 7. тестирование производительности, 8. основы программирования, 9. вопросы на собеседовании, 10. вопросы открытого теста, 11. тестирование безопасности, 12. основы работы с компьютером

Метод получения информации:

Supongo que te gusta

Origin blog.csdn.net/myh919/article/details/131981111
Recomendado
Clasificación