2017-01-25 12 views
1

Я рассматриваю возможность преобразования некоторых тестов unittest.TestCase в Pytest, чтобы воспользоваться приборами Pytest. Одной из особенностей unittest, что я не смог легко найти эквивалент в Pytest, однако, является возможность создавать тестовые комплекты и запускать их. В настоящее время я часто что-то вроде этого:Контроль выполнения тестов с использованием pytest

import unittest 

class TestSomething(unittest.TestCase): 
    def test_1(self): 
     self.assertEqual("hello".upper(), "HELLO") 

    def test_2(self): 
     self.assertEqual(1+1, 2) 

if __name__ == "__main__": 
    suite = unittest.TestSuite() 
    # suite.addTest(TestSomething('test_1')) 
    suite.addTest(TestSomething('test_2')) 
    runner = unittest.TextTestRunner() 
    runner.run(suite) 

По комментируя и из линий с addTest, я могу легко выбрать, какие тесты для запуска. Как мне сделать что-то подобное с Pytest?

ответ

2

Вы можете использовать аргумент -k для запуска определенных тестов. Например

# put this in test.py 
import unittest 

class TestSomething(unittest.TestCase): 
    def test_1(self): 
     self.assertEqual("hello".upper(), "HELLO") 

    def test_2(self): 
     self.assertEqual(1+1, 2) 

Запуск всех тестов в классе TestSomething можно сделать так:

py.test test.py -k TestSomething 

Запуск только test_2:

py.test test.py -k "TestSomething and test_2" 

еще примеры в documentation

1

В дополнение к использованию -k f ilters, вы можете назвать конкретные тестовые классы или случаи, которые вы хотите запустить,

py.test test.py::TestSomething::test_2 

Убежишь только test_2

0

Другой путь заключается в использовании специальных имен испытаний. Они могут быть настроены в файле pytest.ini.

# content of pytest.ini 
# can also be defined in tox.ini or setup.cfg file, although the section 
# name in setup.cfg files should be "tool:pytest" 
[pytest] 
python_files=check_*.py 
python_classes=Check 
python_functions=*_check 

Другой способ - принять меры в conftest.py. В этом примере используется переменная конфигурации collect_ignore. Это список тестовых путей, которые следует игнорировать. В этом примере test_somthing.py всегда игнорируется для сбора. test_other_module_py2.py игнорируется, если мы тестируем с питоном 3.

# content of conftest.py 
import sys 

collect_ignore = ["test_something/test_something.py"] 
if sys.version_info[0] > 2: 
    collect_ignore.append("test_other/test_other_module_py2.py") 

Они были свободно взяты из документации pytest главы Changing standard (Python) test discovery

Перейти к pytest. Это так приятно.

0

Ответ на вопрос mbatchkarov, так как имена моих тестов могут быть довольно продолжительными, я бы хотел, чтобы все еще были в состоянии выбирать тесты, комментируя строки и вызывая их и нажимая «Cntrl + B» в Sublime (или " Cntrl + R "с использованием Atom Runner). Один из способов сделать это заключается в следующем:

import unittest 
import pytest 

class TestSomething(unittest.TestCase): 
    def test_1(self): 
     self.assertEqual("hello".upper(), "HELLO") 

    def test_2(self): 
     self.assertEqual(1+1, 2) 

if __name__ == "__main__": 
    tests_to_run = [] 
# tests_to_run.append('TestSomething and test_1') 
    tests_to_run.append('TestSomething and test_2') 
    tests_to_run = " or ".join(tests_to_run) 
    args = [__file__, '-k', tests_to_run] 
    pytest.main(args) 

Идея заключается в том, что из-за Pytest принимает строковое выражение для соответствия тестов (а не просто список тестов), необходимо сформировать список выражений, соответствующих одному только для проверки и объединить их с использованием or.

0

Думайте, что лучший способ сделать это - использовать специальные маркеры pytest. Вы должны отметить специфические тесты (которые вы хотите запустить) с @pytest.mark.mymarkername

И запустить только тесты с персонализированными маркерами с помощью команды: py.test -v -m mymarkername

Здесь Вы можете найти более подробную информацию о маркерах: http://doc.pytest.org/en/latest/example/markers.html