2017-02-21 7 views
1

Я ничего не знаю о тестировании, поэтому вам нужна ваша помощь.Тестирование функции python со списком аргументов для исключений

Получил функцию python, которая время от времени меняется. Также есть список аргументов, которые эта функция должна обрабатывать без исключений. Итак, вопрос - как сделать правильный простой тест для этого.

мне нужно что-то вроде

for arg in args: 
    cmd = 'python script.py %s' % arg 
    p = subprocess.Popen(cmd, shell = True, 
     stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
    output, err = p.communicate() 
    if err: 
     print arg 
     print err 

Нормально ли это сделать с таким самостоятельным написанным сценарием, или есть какие-либо специальные модули для этого?

Или что это лучший способ справиться с этим?

ответ

1

В идеале, модуль script.py содержит функцию main(), который вызывается при вызове script.py как сценарий, с обычной идиомой

import sys 

def main(arg1, arg2, arg3): 
    print(arg1, arg2, arg3) 
    return 42 

if __name__ == "__main__": 
    main(*sys.argv[1:]) 

В этом случае, вы можете просто импортировать функцию main и сделать тестирование без всяких хлопот подпроцесса:

from script import main as testsubject 

assert testsubject(1, 2, 3) == 42 

Если script.py не в поисковой питон пути, возможно, придется добавить его вручную:

import sys 
sys.path.append("/path/to/folder/containing/script.py") 

from script import main 

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

С uittest, тест может выглядеть следующим образом:

import unittest 

import script 

class Test_Script(unittest.TestCase): 

    def test_return_value(self): 
     answer = script.main(1, 2, 3) 
     self.assertEqual(answer, 42) 

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

Edited добавить:

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

def test_runs_without_exception(self): 
     script.main(1, 2, 3) 

Если script.main() выдает исключение, то unittest поймает это исключение и напечатает соответствующее сообщение об ошибке.

Если все, что вам нужно сделать, это просто проверить один сценарий, используя unittest может быть излишним, и вы можете уйти с возможно более простой

import time 

import script 

try: 
    sript.main(1, 2, 3) 
except Exception as e: 
    print("An Exception occured!") 
    with open("script_log.txt", "a") as logfile: 
     logfile.write(str(time.time()) + "\t" + str(e)) 
    raise e 
else: 
    print("Everything is fine.") 

Если у вас есть контроль над script.py, вы можете для включения в него некоторых объектов каротажа в script.py. В этом случае вы можете посмотреть в пакет logging.

+0

Проблема в том, что моя функция ничего не возвращает. Он просто печатает тонны информации. Поэтому мне не нужно проверять равенство; Я хочу быть уверенным, что исключений нет. –

+0

. Развернутый ответ, чтобы включить случай функции без возвращаемого значения. – Jan