Структура модульного тестирования: запуск тестов в новых процессах - PullRequest
1 голос
/ 22 июля 2011

Я запрограммировал приложение с графическим интерфейсом, которое использует Framework модульного тестирования .Приложение показывает все найденные юнит-тесты в виде дерева.Если вы щелкнете по имени юнит-теста, программа запустит этот тест и покажет результат.Это работает!

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

Модуль «многопроцессорная обработка» является решением, но у меня возникли проблемы с моей реализацией.Я поместил свой «код выполнения теста» в собственную функцию и попытался:

item = self.GetSelection()
name = self.GetItemText(item)
p = multiprocessing.Process(target=ExecuteTest, args=(name, item))
p.daemon = True
p.start()

Но потом я получил ошибки.

Traceback (most recent call last):
  File "C:\a\b\c\hhh\a.py", line 577, in OnLeftDClick
    p.start()
  File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
    self._popen = Popen(self)
  File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python26\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python26\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 548, in save_tuple
    save(element)
  File "C:\Python26\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python26\lib\pickle.py", line 686, in _batch_setitems
    save(v)
  File "C:\Python26\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 396, in save_reduce
    save(cls)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 748, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <type 'PySwigObject'>: it's not found as __builtin__.PySwigObject

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
    self = load(from_parent)
  File "C:\Python26\lib\pickle.py", line 1370, in load
    return Unpickler(file).load()
  File "C:\Python26\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Python26\lib\pickle.py", line 880, in load_eof
    raise EOFError
EOFError

У кого-нибудь есть идеи?

Ответы [ 3 ]

1 голос
/ 23 июля 2011

Очевидно, вы пытаетесь «засолить» что-то, что невозможно выбрать (кажется, что это объект wx). Попробуйте использовать в качестве параметра только «простые» объекты (т.е. без графического объекта внутри), и это должно работать лучше. Вы также можете взглянуть на библиотеку python nose unitest , которая позволяет автоматически запускать тесты в многопроцессорных системах.

0 голосов
/ 22 июля 2011

Я рекомендую вам создать отдельный скрипт, который запускает тест, затем вы можете использовать модуль subprocess для вызова этого скрипта, дав ему имена тестов для запуска.

Бонус заключается в том, что вы можете использовать тот же сценарий на сервере непрерывной интеграции, ночной сборке или других процессах пакетного типа, для которых не требуется графический интерфейс.

0 голосов
/ 22 июля 2011

Создать дочерний процесс, используя fork .Это потребует от вас некоторой работы, но будет работать.

Как примечание: многопроцессорный модуль реализован с использованием fork.


Обновление: После тщательного изучения вашего кода кажется, что переменная item не является замачиваемой (это слово?).Я не думаю, что вам это нужно, так как вы можете заменить его на что-то более простое (значение или что-то в этом роде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...