2014-10-09 3 views
0

я новичок в Python и блок test.following является основным UnitTest программы, которая вызывает другие программы питона, который действует как тестовые примерывызов отдельной программы питона в тестовом модуле

import unittest 
from test import test_support 

class MyTestCase1(unittest.TestCase): 

    def test_feature_one(self): 

     print "testing feature one" 
     execfile("/root/test/add.py") 

def test_main(): 
    test_support.run_unittest(MyTestCase1); 

if __name__ == '__main__': 
    test_main() 

add.py является основной программой, которая добавляет два нет и отображает его.

#!/usr/bin/env python 
import sys 

def disp(r): 
     print r 
def add(): 
     res = 3+5; 
     disp(res) 
add() 

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

====================================================================== 
ERROR: test_feature_one (__main__.MyTestCase1) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "first.py", line 17, in test_feature_one 
    execfile("/root/test/add.py") 
    File "/root/test/add.py", line 12, in <module> 
    add() 
    File "/root/test/add.py", line 10, in add 
    disp(res) 
NameError: global name 'disp' is not defined 

---------------------------------------------------------------------- 

ответ

0

Из документации на ExecFile (https://docs.python.org/2/library/functions.html#execfile):

«Помните, что на уровне модуля, Глобал и местные жители такие же словарь ... Если словарь местных жителей. опускается, по умолчанию используется словарь глобалов. Если оба словаря опущены, выражение выполняется в среде, где вызывается execfile(). "

Я не очень хорошо знаком с тем, как здесь работают глобальные и местные жители, поэтому я не могу дать глубокое объяснение, но из того, что я понял: Ключ здесь в том, что вы запускаете execfile из функции , Если вы запустите его с уровня модуля, он будет работать:

if __name__ == '__main__': 
    execfile('blah') 

Но если запустить его из функции:

def f(): 
    execfile('blah') 

if __name__ == '__main__': 
    f() 

он потерпит неудачу. Из-за магии с глобалами и местными жителями.

Как исправить ваш пример: добавить словарь в аргументы execfile, и он будет работать (помните, что строка из docs: «Если словарь locals опущен, по умолчанию используется словарь глобалов».).

Но вместо использования execfile я бы рекомендовал импортировать add из add.py и просто вызвать его в тесте. (Это также потребует, чтобы переместить вызов, чтобы добавить FUNC в add.py к if __name__ == '__main__':, чтобы не запускать добавить на импорт.

Вот некоторая информация о том, как Глобалы и местные жители работают http://www.diveintopython.net/html_processing/locals_and_globals.html.

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