2013-04-06 2 views
2

Вопрос, поставленный в названии, может быть случай the XY-Problem, но я не смог найти лучшего кратким описанием. Я хочу протестировать несколько скриптов python, запустив execfile(filename) на каждом из них, а затем посмотрим, будут ли они инициировать утверждение/исключение. До сих пор так хорошо, но большинство из них также запустили gui для конформации с одним заявлением, скажем world.show('someString'). Для автоматического тестирования я не хочу видеть gui. Как я могу подавить gui без изменения самих скриптов?Как подавить выполнение инструкции в скрипте с помощью execfile?

Edit: Что касается комментариев: В эссенции, я мог бы просто сделать:

import unittest 

class TestExamples(unittest.TestCase): 

    def test_firstExample(self): 
     execfile('example1.py') 

    def test_secondExample(self): 
     execfile('example2.py') 

    # and many more 

if __name__ == '__main__': 
    unittest.main() 

Но) есть больше, чем два, и я предпочел бы не написать тестовую функцию для каждого примера , Я бы хотел, чтобы их проверяли, просто находясь в папке. Это можно было бы решить путем unittests discover. И б), большинство из них заканчивается визуализацией расчета, как и с matplotlib.pyplot.show(). Я хочу подавить эту визуализацию, не меняя самих примеров.

+2

Вы должны были бы заменить GUI вызов с макетом, но если это возможно, зависит от конкретного графического интерфейса. Тем не менее, я бы реорганизовал скрипты для использования функции 'main()'. –

+1

Что не может сделать для вас модуль unittest Python или «нос»? Тем не менее, Martijn сделал хороший вывод, что вам нужно высмеять определенные интерфейсы. –

ответ

3

Вот довольно простой вариант: если у вас есть файл world.py, как это ...

def show(text): 
    return some_gui_stuff.confirm(text) 

... затем создать новый файл fakeworld.py который выглядит следующим образом ...

def show(text): 
    return True 

... затем в тестовом сценарии, сделать что-то вроде ...

import sys 
sys.modules['world'] = __import__('fakeworld') 
execfile('example1.py') 

Когда example1.py пытается import world, он будет использовать поддельную версию вы импортировали в верхней части тестового сценария.

Это означает, что вам нужно будет создать фальшивую версию для каждой функции в world.py. Если есть много функций, но меняется только один или два нужно, это может быть проще сделать тестовый скрипт, как это ...

import world 
import fakeworld 
world.show = fakeworld.show 
execfile('example1.py') 

... или если world.show буквально единственной функцией, вы, вероятно, даже не нужно, чтобы создать fakeworld.py - просто сделать что-то вроде ...

import world 
world.show = lambda x: True 
execfile('example1.py') 
1

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

Но «легкий путь» может быть установить xvfb - виртуальный сервер фреймбуфера X (например, для Debian это будет xfvb пакет) и запустить UnitTest скрипт, используя следующую команду:

xvfb-run python unittest.py 
+0

Как мне «насмехаться» с графическим интерфейсом? 'xvfb' прерывания с GLX не найдены. – Psirus

+0

Ну, это всего лишь проблема с конфигурацией вашей системы, возможно, отсутствует libgl - * - glx или sth вроде этого (в зависимости от используемого драйвера), но как сделать исправление, которое является вопросом для суперпользователя или сайта askubuntu. –

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