2016-07-04 6 views
4

я в настоящее время работает мои тесты, как это:испытания фильтра после того, как открыть

tests = unittest.TestLoader().discover('tests') 
unittest.TextTestRunner().run(tests) 

Теперь я хочу, чтобы запустить определенный тест, зная его имя (как test_valid_user), но не зная, что его класс. Если есть более одного теста с таким именем, я бы хотел запустить все такие тесты. Есть ли способ фильтровать тесты после discover?

Или, возможно, есть другие решения этой проблемы (обратите внимание, что это не должно быть сделано из командной строки)?

ответ

2

Вы можете использовать unittest.loader.TestLoader.testMethodPrefix переменная экземпляра для изменения фильтра методов тестирования в соответствии с другим p refix, чем «тест».

Скажет у вас есть tests каталога с этим царём модульными тестами:

import unittest 


class MyTest(unittest.TestCase): 
    def test_suite_1(self): 
     self.assertFalse("test_suite_1") 

    def test_suite_2(self): 
     self.assertFalse("test_suite_2") 

    def test_other(self): 
     self.assertFalse("test_other") 

Вы можете написать свою собственную discover функцию, чтобы обнаружить только функции тестирования, начиная с «test_suite_», например:

import unittest 


def run_suite(): 
    loader = unittest.TestLoader() 
    loader.testMethodPrefix = "test_suite_" 
    suite = loader.discover("tests") 
    result = unittest.TestResult() 
    suite.run(result) 
    for test, info in result.failures: 
     print(info) 


if __name__ == '__main__': 
    run_suite() 

примечание: аргумент «тесты» в методе discover - путь к каталогу, поэтому вам может потребоваться написать полный путь.

В результате, вы получите:

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 8, in test_suite_1 
    self.assertFalse("test_suite_1") 
AssertionError: 'test_suite_1' is not false 

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 11, in test_suite_2 
    self.assertFalse("test_suite_2") 
AssertionError: 'test_suite_2' is not false 
0

Есть два способа запустить один метод испытания:

Командная строка:

$ python -m unittest test_module.TestClass.test_method 

Использование Python скрипт:

import unittest 

class TestMyCode(unittest.TestCase): 

    def setUp(self): 
     pass 

    def test_1(self): 
     self.assertTrue(True) 

    def test_2(self): 
     self.assertTrue(True) 

if __name__ == '__main__': 
    testSuite = unittest.TestSuite() 
    testSuite.addTest(TestMyCode('test_1')) 
    runner=unittest.TextTestRunner() 
    runner.run(testSuite) 

Выход:

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

Ран 1 тест в 0.000s

OK

1

Еще один простой способ, будет использовать py.test с -k вариант, который делает тест сканирование ключевых слов. Он будет запускать любые тесты, чье имя соответствует выражению ключевого слова.

Несмотря на то, что с использованием командной строки вы не хотите, пожалуйста, не забудьте вызывать командную строку из вашего кода с помощью subprocess.call, чтобы передать любые аргументы, которые вы хотите динамически.

Например: Предположим, что у вас есть следующие тесты:

def test_user_gets_saved(self): pass 
def test_user_gets_deleted(self): pass 
def test_user_can_cancel(self): pass 

Вы можете позвонить py.test из кли:

$ py.test -k "test_user" 

или из кода:

return_code = subprocess.call('py.test -k "test_user"', shell=True)