вывод django unittest

Я хотел бы запустить django unittest через подпроцесс python, и я хотел бы сохранить все данные (особенно слова Failure или OK) в переменной. Однако, когда я использую подпроцесс для запуска этого, вывод содержит только части:

«Создание тестовой базы данных для псевдонима 'default' ...» «Уничтожение тестовой базы данных для псевдонима 'default' ...»

Остальное просто выходит на экран, чего я не хочу. Как я могу получить весь вывод unittest django в переменную.

args_list = ['python', '/path/to/manage.py', 'test', 'myapp']
process=subprocess.Popen(args_list, stdout=subprocess.PIPE)
output, errors = process.communicate()
print output

вывод будет просто равен: Создание тестовой базы данных для псевдонима 'default' ... Уничтожение тестовой базы данных для псевдонима 'default' ...

Однако на моем экране появляется весь стандартный вывод django unittest. Как все выходные данные можно сохранить в переменной.


person Christopher H    schedule 09.11.2012    source источник


Ответы (4)


Вам нужно перенаправить stderr на stdout. Вот фиксированный код:

args_list = ['python', '/path/to/manage.py', 'test', 'myapp']
process=subprocess.Popen(args_list, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
output, errors = process.communicate()
print output

В качестве альтернативы в оболочке вы можете ввести что-то вроде этого:

python manage.py test myapp > stdout.txt 2> stderr.txt
person Nate-Bit Int    schedule 24.12.2014

Вы можете обрабатывать результаты тестирования с помощью объекта unittest.TestResult. См. Пример https://stackoverflow.com/a/284192/579461.

person Brian Cajes    schedule 09.11.2012

Если вы действительно хотите перенаправить stdout в переменную для проверки, вы можете сделать это с помощью следующего кода:

from cStringIO import StringIO
import sys

output = StringIO()
sys.stdout = output
print "Hello World!"
print 42
sys.stdout = sys.__stdout__
print output.getvalue()
>>>
Hello World!
42
person Talvalin    schedule 09.11.2012
comment
этот код работает, но не работает с выводом модульных тестов django - person Christopher H; 09.11.2012
comment
Это не сработает. Замена sys.stdout ничего не делает для дочернего процесса. - person jfs; 26.12.2014

Как все выходные данные можно сохранить в переменной.

Перенаправить stderr на stdout:

from subprocess import check_output, STDOUT

output = check_output(args_list, stderr=STDOUT)
print output,
person jfs    schedule 26.12.2014