Я использовал примеры Python в своем ответе, чтобы проиллюстрировать различия.
Stub - Stubbing - это метод разработки программного обеспечения, используемый для реализации методов классов на ранних этапах жизненного цикла разработки. Они обычно используются в качестве заполнителей для реализации известного интерфейса, где интерфейс завершен или известен, но реализация еще не известна или не завершена. Вы начинаете с заглушек, что означает, что вы только записываете определение функции и оставляете фактический код на потом. Преимущество заключается в том, что вы не забудете методы и сможете продолжать думать о своем дизайне, видя его в коде. Вы также можете сделать так, чтобы ваш заглушка возвращал статический ответ, чтобы ответ мог быть немедленно использован другими частями вашего кода. Объекты-заглушки дают правильный ответ, но он статический, независимо от того, какой ввод вы передаете, вы всегда получите один и тот же ответ:
class Foo(object):
def bar1(self):
pass
def bar2(self):
#or ...
raise NotImplementedError
def bar3(self):
#or return dummy data
return "Dummy Data"
Mock объекты используются в фиктивных тестовых примерах, они проверяют, что определенные методы вызываются для этих объектов. Поддельные объекты - это моделируемые объекты, которые имитируют поведение реальных объектов контролируемыми способами. Обычно вы создаете фиктивный объект для проверки поведения какого-либо другого объекта. Скандалы позволяют нам моделировать ресурсы, которые либо недоступны, либо слишком громоздки для модульного тестирования.
mymodule.py:
import os
import os.path
def rm(filename):
if os.path.isfile(filename):
os.remove(filename)
test.py:
from mymodule import rm
import mock
import unittest
class RmTestCase(unittest.TestCase):
@mock.patch('mymodule.os')
def test_rm(self, mock_os):
rm("any path")
# test that rm called os.remove with the right parameters
mock_os.remove.assert_called_with("any path")
if __name__ == '__main__':
unittest.main()
Это очень простой пример, который просто запускает rm и подтверждает параметр, с которым он был вызван. Вы можете использовать mock с объектами, а не только с функциями, как показано здесь, и вы также можете вернуть значение, чтобы использовать фиктивный объект вместо заглушки для тестирования.
Подробнее о unittest.mock , примечание в mock для python 2.x не входит в unittest, но является загружаемым модулем, который можно загрузить через pip (pip install mock).
Я также прочитал «Искусство модульного тестирования» Роя Ошерова, и я думаю, было бы здорово, если бы подобная книга была написана с использованием примеров Python и Python. Если кто-нибудь знает о такой книге, пожалуйста, поделитесь. Ура :) 1024 *