Модульное тестирование с использованием кода, зависящего от сети
-
09-06-2019 - |
Вопрос
Я пытаюсь лучше подходить к модульному тестированию своего кода, но прямо сейчас я пишу много кода, который имеет дело с удаленными системами.SNMP, WMI, что-то в этом роде.С большинством классов я могу создавать макеты объектов для их тестирования, но как вы справляетесь с модульным тестированием реальной системы?Например, если мой класс завершает работу и получает объект Win32_LogicalDisk для сервера, как я могу его модульно протестировать?
Решение
Предполагая, что вы имели в виду "Как мне протестировать то, над чем трудно / невозможно издеваться":
Если у вас есть класс, который "выходит и получает объект Win32_LogicalDisk для сервера" И делает что-то еще (каким-то образом использует объект 'Win32_LogicalDisk'), предполагая, что вы хотите протестировать части класса, которые используют этот объект, вы можете использовать Внедрение зависимостей чтобы позволить вам издеваться над объектом 'Win32_LogicalDisk'.Например:
class LogicalDiskConsumer(object):
def __init__(self, arg1, arg2, LogicalDiskFactory)
self.arg1=arg1
self.arg2=arg2
self.LogicalDisk=LogicalDiskFactory()
def consumedisk(self):
self.LogicalDisk.someaction()
Затем в вашем коде модульного тестирования передайте 'LogicalDiskFactory', который возвращает макет объекта для 'Win32_LogicalDisk'.
Другие советы
Самый простой способ протестировать вещи, которые трудно смоделировать, - это реорганизовать код таким образом, чтобы ваш код (логика, которую стоит протестировать) находился в одном месте, а другие вещи, которые использует ваш код, находились в отдельных модулях.Модуль легко смоделировать, и таким образом вы сможете сосредоточиться на своей бизнес-логике.
Вы могли бы создать набор "тестовых заглушек", которые заменяют процедуры базовой библиотеки и возвращают известные значения, возможно, после подходящих задержек.
В качестве примера, недавно мне понадобилось разработать код для запуска внутри продукта третьей стороны.Проблема заключалась в том, что наш "партнер" должен был выполнять компиляцию и интеграцию со своим базовым кодом:Мне не разрешили этого сделать посмотрите на их код в любой форме!Моя стратегия состояла в том, чтобы создать очень простой эмулятор, который делал то, что я мысль их код работал, основываясь на информации, полученной от их инженеров.Мы использовали язык, который позволял легко переключать различные части эмулятора в каждой сборке и из нее, поэтому я мог проводить огромное количество тестов, прежде чем привлекать нашего партнера к созданию каждой новой итерации.
Я бы снова использовал тот же метод, поскольку программных проблем в этом конкретном продукте примерно на порядок меньше, чем в нашем следующем по надежности продукте!