#python #unit-testing
#python #модульное тестирование
Вопрос:
Вопрос в том, есть ли способ пометить модульные тесты разными категориями: модуль, интеграция, «dangerous_integration». Затем, скажем, из настройки «Team City», автоматически пропустить «dangerous_integration»?
Для тестов, помеченных как «Опасные», они не должны запускаться автоматически. Их нужно запускать вручную, предпочтительно даже в отладчике с очень пристальным наблюдением?
Для python вот пример, когда у меня есть класс, который может отправлять текущие сделки на криптобиржи. Я по существу отключаю все методы тестирования с помощью «return» в качестве первой строки метода тестирования, чтобы избежать ситуации, когда мы непреднамеренно отправляем текущие сделки на улицу.
import unittest
class BinanaceConnectorTests(unittest.TestCase):
def setUp(self):
...
def tearDown(self):
...
def testSendRealOrders(self):
return <-- I hardcode return here so nobody accidentally
... actual implementation shunted by above return ...
Это правильный способ сделать это? Я использую Visual Studio. Я помню, что в C # с xunit есть способ пометить модульные тесты разными категориями.
Я думаю, что не существует такой вещи, как тесты «dangerous_integration» — если вам нужна такая вещь, разделите эти тесты на ручной скрипт Python и просто не помечайте их как модульные тесты любого рода. Это было бы безопаснее.
Комментарии:
1. Ваши тесты не должны взаимодействовать с внешними службами, точка. Используйте
unittest.mock
для замены «опасных» вызовов чем-то безопасным или (еще лучше) разработайте свой код, чтобы разрешить использование альтернативного коммуникатора при тестировании. (В качестве примера, функция, которая принимает имя файла и пытается его открыть, должна вместо этого использовать файлоподобный объект. При использовании продукта сначала открывается нужный файл, а затем передается функции. Для тестирования вы передаете экземплярStringIO
илиBytesIO
. Вы можете сделать что-то подобное с любой библиотекой, которую вы используете для подключения к криптобирже.)2. Здесь действительно тестируется интеграция exchange, поэтому на самом деле я не могу ничего издеваться. Для таких вещей, как получение рыночных данных или истории торговли, fine может поместить под модульные тесты. Но отправка живого заказа слишком опасна. С другой стороны, если такой тест не автоматизирован, каждый раз запускайте вручную, это большая работа.
3.
unittest
предоставляет способы написания пользовательского тестового запуска, который дает вам контроль над тем, какие тесты фактически выбраны для запуска. По крайней мере, вы можете изолировать свои текущие тесты от их собственных модулей и попросить вашего тестировщика пропустить эти модули.4. Также есть
skip
декоратор, который вы можете использовать, чтобы пропустить текущие тесты, но я бы даже не рискнул помещать их в один модуль с другими тестами5. да, спасибо, безопасность превыше всего!
Ответ №1:
Представленные вами сценарии выборочного выполнения тестов (например, dangerous_integration), вероятно, лучше рассматривать по-другому, как уже обсуждалось в комментариях. Однако существуют ситуации, когда вы хотите, чтобы определенные тесты были исключены в обычном случае. Например, у вас может быть несколько длительных тестов, которые вы хотите выполнять только изредка. Или некоторые тесты выдают результаты, выходящие за рамки простых результатов «пройдено» или «не удалось», которые требуют тщательного анализа, который вы также хотите запускать только время от времени.
Одним из подходов может быть группировка этих тестов в собственные классы и использование этого для включения или исключения их из соответствующих запусков. Или, если кажется более целесообразным реализовать эти тесты вместе с другими тестами, вы могли бы использовать некоторое соглашение об именовании, которое указывает, к какой категории относится тест. У вас есть возможность выборочно запускать тесты, которые сгруппированы или названы определенным образом, как описано в руководстве по Python unittest:https://docs.python.org/3.7/library/unittest.html. Например, атрибут testNamePatterns
of unittest.TestLoader
может использоваться для выбора тестов на основе их имен.