2013-02-23 3 views
2

Я курирую большое количество модульных тестов для большого проекта Python. Мы используем nose, чтобы выполнить наше обнаружение и выполнение теста. У меня есть несколько тестовых файлов, которые действительно не должны запускаться в определенных условиях. Например, возможно, у меня есть тестовый модуль, который никогда не должен запускаться в Windows (только на Mac и Linux).Как сделать «раннее возвращение» импорта под Носом?

Вот некоторые решения я использовал: методы испытаний

  1. Все или классы с условиями, используя нос отличных attrib plugin.
  2. Использование unittest.skipIf() на методы испытаний или классов
  3. Используйте nose's pattern exclusions пропускать файлы с windows во имя, например.

Моя жалоба 1 & 2 является то, что они заставляют меня импортировать модуль, который, по меньшей мере, пустая трата времени и, возможно, привести к ошибкам, если есть зависимые от импорта платформы. Мне не нравится # 3, потому что я чувствую, что он хрупкий, и не легко проявляется при чтении теста, что он будет пропущен. Все трое, похоже, чрезмерно зависят от взаимодействия между тестом и тестовым бегуном, я бы хотел что-то, что просто в тесте.

Я хотел бы сделать что-то вроде следующего в верхней части тестового модуля:

"""This module should not be run on Windows""" 
import platform 
if platform.system() == 'Windows': 
    <stop reading this module. nothing to see here> 

# do the tests. 

Как я могу сказать, Python или нос, чтобы остановить чтение модуля, но нет никакой ошибки? Наверное, я ищу эквивалент импорта раннего возвращения.

+0

Вы можете сделать это, вызывая исключение, но вы должны поймать, что в коде клиента. – wim

+0

Если ваша основная проблема: «Импорт - это пустая трата времени», то я бы не стал слишком беспокоиться об этом. Python импортирует 30-40 модулей только для запуска интерпретатора (см. Python -vv), а запущенные проекты, которые импортируют 100 или 1000, не замедлят вас. Кроме того, даже в огромном проекте количество тестового кода, специфичного для платформы, должно быть довольно маленьким. Сколько модулей мы говорим? – Seth

+0

Определенно говорить о 1000-х годах, но некоторые из них - медленный импорт из-за плохого дизайна. Однако основная проблема заключается в том, что эти импортные сбои не работают, создавая ложные негативы в наших тестовых журналах. – dbn

ответ

1

Под носом и unittest исключение SkipTest обрабатывается специально - это не сбой. Таким образом, следующий код будет остановить выполнение, и никакой ошибки не будет сообщено UnitTest бегуна:

import unittest 
import platform 
if platform.system() == 'Windows': 
    raise unittest.case.SkipTest("The rest of this code will not be run on Windows.") 
2

Возможность вернуться с самого раннего этапа после выполнения модуля has been proposed before, но получила некоторые отрицательные голоса, и эта функция не была добавлена ​​на этот язык.

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

+0

Спасибо, эта тема весьма полезна. – dbn

1

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

+0

Да, это то, что я упомянул в комментарии. – wim

+0

Клиентский скрипт - это инструмент Nose, сторонний инструмент. Он регистрирует сбой при создании ImportError. – dbn

Смежные вопросы