запускать некоторые тесты только в определенной среде

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

Как я могу указать это с помощью Nosetests? Оптимальным для меня было бы, если бы Nosetests перечислял пропущенные тесты и причину пропусков.


person Albert    schedule 24.07.2015    source источник


Ответы (2)


Обычно это можно сделать с помощью стандартной библиотеки unittest. В самом начале тестирования вы всегда можете проверить предварительные условия с помощью декораторов (предпочтительно) или путем вызова SkipTest исключение.

import unittest 

class MyTestCase(unittest.TestCase):

    @unittest.skipIf(not have_gpu(),
                     "no gpu on this system")
    def test_gpu_performance(self):
        pass

    def test_something_else(self):
        if not have_gpu():
            raise unittest.SkipTest("no gpu")
person Oleksiy    schedule 24.07.2015

Вы можете пометить тесты с помощью декоратора @attr из nose.plugins.attrib, который вы хотите запустить только если заданный атрибут установлен.

@attr(has_cuda_gpu=1)
def test_something(self):
    pass

Затем создайте сценарий запуска тестов, который настраивает эти атрибуты. Если ваши условия соблюдены, добавьте эти атрибуты:

ATTRS="some_other_condition=1"
if [ check_cuda_gpu ]; then
    ATTRS="$ATTRS,has_cuda_gpu=1"
fi
nosetests -a $ATTRS

Когда вы запускаете свои тесты, а has_cud_gpu не был добавлен к атрибутам, то тесты, отмеченные этим условием, будут пропущены.

person aorcsik    schedule 24.07.2015
comment
Есть ли способ проверить условие также в самом Python, возможно, это есть в тестовом коде? Что-то вроде: if not have_gpu(): raise CannotTest("no gpu") или около того. - person Albert; 24.07.2015
comment
Я не знаю, есть ли для этого библиотека python, но вы всегда можете выполнять системные вызовы из python;) - person aorcsik; 24.07.2015