2011-12-15 2 views
6

Я использую unittest, и он печатает «.», «E» или «F» для «ok», «error» и «fail» после каждого теста. Как отключить его? Im, использующий Python 2.7, и эти отпечатки поступают из класса runner, который встроен. Звучит очень сложно переопределить классы, потому что все они вложены.Отключите печать в python unittest

Редактировать: Я только хочу снять символы E. и F, потому что они не появляются одновременно с каким-либо другим входом в мои тесты.

+0

Зачем вы хотите это сделать? Разумеется, полезно проверить ход тестов? –

+0

В моем случае это добавляет путаницу, поскольку мои тесты запускаются параллельно, я печатаю 1 сообщение журнала, и эти сообщения тестового журнала arent синхронизируются с соответствующими «E» «F» или «.». , – swan

+0

Как пропустить эти тесты в отдельных процессах, которые будут разделять выходные потоки? –

ответ

1

В зависимости UnitTest в рамки вы используете (стандартный, нос ...), у вас есть несколько способ уменьшить подробность:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
+1

* «.», «E» или «F» * все еще печатаются в режиме '-q'. – Constantinius

+0

Я не запускаю свои тесты с помощью команды python -m unittest, но вместо этого я запускаю их параллельно, используя это: http://code.activestate.com/recipes/391414/ – swan

+0

В Python 3.6 '-q', кажется, подавляет буквы, но я предполагаю, что это ошибка, которая была исправлена ​​давно. Все выходные результаты тестирования будут напечатаны. – Erhhung

9

Выход unittest записывается в стандартный поток ошибок, который вы можете проехать куда-то еще. На коробке ничего * это было бы возможно так:

python -m unittest some_module 2> /dev/null 

На окнах, это должно выглядеть следующим образом (спасибо Карл Knechtel):

python -m unittest some_module 2> NUL 

Если вы запускаете тесты из питона , вы можете просто заменить stderr поток вроде этого:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

Поскольку вы просто хотите отключить обновления для символов., F, E, вы также можете создать свой собственный класс TestResult, переопределив значение по умолчанию. В моем случае (Python 2.6) это будет выглядеть так:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

Это эффективно отключает печать персонажей, но сохраняя функциональность по умолчанию.

Теперь мы также нужен новый TestRunner класса и переопределить метод _makeResult:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

С помощью этого бегунка теперь вы можете наслаждаться бесплатным тестированием журнала.

Просто примечание: к сожалению, из командной строки это невозможно.

+0

'2> NUL' должен работать для окон, если я думаю ясно. –

+0

'os.devnull' - это строка. Вы имели в виду 'open (os.devnull, 'w')'? – jcollado

+0

@ jcollado: Да, спасибо, я пропустил это. – Constantinius

5

Немного поздний ответ, но кому-то это может оказаться полезным. Вы можете повернуть. E и F с установки уровня детальности 0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

Вы еще конечный результат и возможные ошибки/исключения в конце испытаний в STDERR.

Протестировано в Python 2.4 и 2.7.