Может ли Unittest в Python запустить список из строк? - PullRequest
0 голосов
/ 18 сентября 2009

Я использую Selenium для запуска тестов на сайте. У меня есть много отдельных тестов, которые мне нужно запустить, и я хочу создать скрипт, который будет запускать все файлы python в определенной папке. Я могу получить имена и импортировать модули, но как только я это сделаю, я не смогу заставить unittest запустить файлы. Вот часть тестового кода, который я создал. Кажется, моя проблема в том, что, как только я ввожу имена, которые они вводят, в виде строк, я не могу от них отказаться

Я хочу написать один из этих файлов для каждой папки или какой-либо способ выполнения всех папок в каталоге. Вот код, который у меня есть:

\## This Module will execute all of the Admin>Vehicles>Add Vehicle (AVHC) Test Cases
import sys, glob, unittest

sys.path.append('/com/inthinc/python/tiwiPro/IE7/AVHC')
AddVehicle_IE7_tests = glob.glob('/com/inthinc/python/tiwipro/IE7/AVHC/*.py')

for i in range( len(AddVehicle_IE7_tests) ):
        replaceme = AddVehicle_IE7_tests[i]
        withoutpy = replaceme.replace( '.py', '')
        withouttree1 = withoutpy.replace( '/com/inthinc/python/tiwipro/IE7/AVHC\\', '' )
        exec("import " + withouttree1)
        AddVehicle_IE7_tests[i] = withouttree1

sys.path.append('/com/inthinc/python/tiwiPro/FF3/AVHC')
AddVehicle_FF3_tests = glob.glob('/com/inthinc/python/tiwipro/FF3/AVHC/*.py')

for i in range( len(AddVehicle_FF3_tests) ):
        replaceme = AddVehicle_FF3_tests[i]
        withoutpy = replaceme.replace( '.py', '')
        withouttree2 = withoutpy.replace( '/com/inthinc/python/tiwipro/FF3/AVHC\\', '' )
        exec("import " + withouttree2)
        print withouttree2


if __name__ == '__main__':
        print AddVehicle_IE7_tests
        unittest.TextTestRunner().run(AddVehicle_IE7_tests)
else:
        unittest.TextTestRunner().run(AddVehicle_IE7_tests)
        unittest.TextTestRunner().run(AddVehicle_FF3_tests)
        print "success"

Ответы [ 2 ]

0 голосов
/ 04 декабря 2009
## This will execute the tests we need to run

import sys, glob, os, time

def run_all_tests():
    sys.path.append('/com/inthinc/python/tiwiPro/usedbyall/run files')
    run_all_tests = glob.glob('/com/inthinc/python/tiwipro/usedbyall/run files/*.py')

    for i in range( len(run_all_tests) ):
        replaceme = run_all_tests[i]
        withoutpy = replaceme.replace( '.py', '')
        withouttree = withoutpy.replace( '/com/inthinc/python/tiwipro/usedbyall/run files\\', '' )
        exec("import " + withouttree)
        exec( withouttree + ".run_test()" )
    if __name__ == '__main__':
        os.system( "taskkill /im java.exe" )

if __name__ == '__main__':
    os.startfile( "C:/com/inthinc/python/tiwiPro/usedbyall/start_selenium.bat" )
    time.sleep( 10 )
    run_all_tests()

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

0 голосов
/ 04 декабря 2009

Хотя я бы точно не рекомендовал этот подход (и, вероятно, то, что вы пытаетесь сделать), вот простой подход, который, по-видимому, дает примерно то, что вы хотите.

В файле "runner.py" (например, аналогично вашему выше): импорт глобус импортный тест

testfiles = glob.glob('subdir/*.py')
for name in testfiles:
    execfile(name)

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

В файле subdir / file1.py:

class ClassA(unittest.TestCase):
    def test01(self):
        print self

В файле subdir / file2.py:

class ClassB(unittest.TestCase):
    def test01(self):
        print self

Вывод при запуске «runner.py»:

C:\svn\stackoverflow>runner
test01 (__main__.ClassA)
.test01 (__main__.ClassB)
.
----------------------------------------------------------------------
Ran 2 tests in 0.004s

OK

Обратите внимание, что это в основном эквивалентно текстовому включению всех тестовых файлов в основной файл, подобно тому, как #include "file.h" работает в C. Как вы можете видеть, среда (пространство имен) для вложенных файлов это файл, в котором вызывается execfile (), поэтому им даже не нужно делать свои собственные вызовы «import unittest». Это должно быть хорошо, если их никогда не нужно запускать автономно, или вы можете просто включить обычный шаблон unittest в каждый файл, если им нужно работать самостоятельно. У вас не может быть дубликатов имен классов во включенных файлах, и вы можете заметить другие трудности.

Я вполне уверен, однако, что вам лучше использовать что-то вроде nose или py.test , которые делают этот вид "тестовой коллекции" намного лучше, чем UnitTest.

...