В каталоге input у меня есть коллекция каталогов input_01 , input_02 и так далее, каждый из которых содержит файл конфигурации input_01.txt , input_02.txt , et c. Я хочу проверить один и тот же вызов функции для каждого из этих файлов конфигурации. Я рассмотрел подход к созданию динамических c тестов для ответа SO здесь и поста в блоге здесь . У меня есть следующий минимальный рабочий пример, основанный на последней ссылке.
"""A simple dynamic test set-up.
Based on the approach used at:
https://eli.thegreenplace.net/2014/04/02/dynamically-generating-python-test-cases
"""
import unittest
import os
import time
def do_something(input_file_path):
time.sleep(5)
print('Do something with file {}'.format(input_file_path))
class MyTests(unittest.TestCase):
pass
def create(input_file):
# noinspection PyUnusedLocal
def test(self):
do_something(input_file)
return test
def create_all():
for d in os.listdir('input'):
input_f = os.path.join('input', d, d + '.txt')
if os.path.isfile(input_f):
test_func = create(input_f)
class_name = 'Test_{0}'.format(d)
globals()[class_name] = type(class_name, (MyTests,), {'test_{0}'.format(d): test_func})
create_all()
if __name__ == '__main__':
unittest.main()
Это хорошо работает, когда я запускаю тесты в одном процессе. Например, когда я запускаю с использованием тестов носа с nosetests --nocapture --verbosity=2 test_mwe.py
, я получаю следующий вывод:
test_input_01 (test_mwe.Test_input_01) ... Do something with file input\input_01\input_01.txt
ok
test_input_02 (test_mwe.Test_input_02) ... Do something with file input\input_02\input_02.txt
ok
----------------------------------------------------------------------
Ran 2 tests in 10.006s
OK
Однако, когда я пытаюсь запустить с использованием нескольких процессов с помощью параметра носовых тестов --processes=2
, то есть nosetests --nocapture --processes=2 --verbosity=2 test_mwe.py
Я получаю ошибки ниже. Для краткости я оставил фрагмент трассировки стека, но при необходимости могу включить его в редактирование.
Failure: ValueError (no such test method in <class 'test_mwe.Test_input_01'>: test) ... ERROR
Failure: ValueError (no such test method in <class 'test_mwe.Test_input_02'>: test) ... ERROR
<stack trace here>
Ran 2 tests in 2.113s
FAILED (errors=2)
Я не очень разбираюсь в Python и тестах на носу, поэтому я, вероятно, здесь упускаю что-то фундаментальное. Есть ли подход или реорганизация этого подхода, где я могу заставить эти динамически созданные тестовые случаи запускаться параллельно, используя параметр --processes=N
тестов носа? Также я могу перейти от использования тестов носа к чему-то другому здесь.