Тестовый фреймворк Python с поддержкой нефатальных сбоев - PullRequest
5 голосов
/ 20 августа 2009

Я оцениваю "рамки тестирования" для автоматизированных системных тестов; до сих пор я ищу Python Framework. В py.test или носе я не вижу что-то вроде макросов EXPECT, которые я знаю из среды тестирования Google. Я хотел бы сделать несколько утверждений в одном тесте, не прерывая тест при первом сбое. Я что-то упустил в этих рамках или это не работает? У кого-нибудь есть предложения по тестированию фреймворков на python, которые можно использовать для автоматизированных системных тестов?

Ответы [ 5 ]

2 голосов
/ 20 августа 2009

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

def raw_print(str, *args):
    out_str = str % args
    sys.stdout.write(out_str)

class DeferredAsserter(object):
    def __init__(self):
        self.broken = False
    def assert_equal(self, expected, actual):
        outstr = '%s == %s...' % (expected, actual)
        raw_print(outstr)
        try:
            assert expected == actual
        except AssertionError:
            raw_print('FAILED\n\n')
            self.broken = True
        except Exception, e:
            raw_print('ERROR\n')
            traceback.print_exc()
            self.broken = True
        else:
            raw_print('PASSED\n\n')

    def invoke(self):
        assert not self.broken

Другими словами, он выводит строки, указывающие, пройден ли тест или нет. В конце теста вы вызываете метод invoke, который фактически выполняет утверждение real . Это определенно не является предпочтительным, но я не видел фреймворка для тестирования Python, который мог бы справиться с такого рода тестированием. Я также не удосужился выяснить, как написать плагин для носа, чтобы делать подобные вещи. : - /

1 голос
/ 21 августа 2009

Как ни странно, звучит так, будто вы ищете что-то вроде моего claft (тестер командной строки и фильтра). Нечто подобное, но гораздо более зрелое.

claft (пока) просто игрушка, которую я написал, чтобы помочь студентам с упражнениями по программированию. Идея состоит в том, чтобы предоставить упражнениям простые файлы конфигурации, которые представляют требования программы в терминах, которые являются достаточно понятными для человека (и декларативными, а не программными), а также пригодными для автоматического тестирования.

claft выполняет все определенные тесты, предоставляя аргументы и входные данные для каждого, проверяя коды возврата и сопоставляя выходные данные (stdout) и сообщения об ошибках (stderr) с шаблонами регулярных выражений. Он собирает все ошибки в списке и печатает весь список в конце каждого набора.

Это НЕ делает произвольные диалоги последовательностей ввода / вывода. Пока он просто передает данные, затем считывает все данные / ошибки. Он также не реализует таймауты и даже не фиксирует неудачные попытки выполнения. (Я ведь говорил, что это просто игрушка, не так ли?). Я также еще не реализовал поддержку сценариев Setup, Teardown и External Check (хотя у меня есть планы сделать это).

Предложение Брайана о «каркасе робота» может быть лучше для ваших нужд; хотя быстрый взгляд на это говорит о том, что он значительно более вовлечен, чем я хочу для своих целей. (Мне нужно, чтобы все было достаточно просто, чтобы новички в программировании могли сосредоточиться на своих упражнениях и не тратить много времени на борьбу с настройкой своего жгута).

Вы можете посмотреть на claft и использовать его или получить свое собственное решение (оно лицензировано BSD). Очевидно, вы можете внести свой вклад обратно. (Он находится на [bitbucket]: (http://www.bitbucket.org/), поэтому вы можете использовать Mercurial для клонирования, разветвления собственного репозитория ... и отправить "запрос на извлечение", если вы когда-нибудь захотите, чтобы я посмотрел на объединение ваших изменений в мой репо).

Опять же, возможно, я неправильно понимаю ваш вопрос.

1 голос
/ 20 августа 2009

Вы запросили предложения, поэтому я предложу Framework робота

0 голосов
/ 22 августа 2009

Почему бы и нет (в unittest, но это должно работать в любых рамках):

class multiTests(MyTestCase):
    def testMulti(self, tests):
        tests( a == b )
        tests( frobnicate())
        ...

при условии, что вы реализовали MyTestCase, чтобы функция была включена в

testlist = []
x.testMulti(testlist.append)
assert all(testlist)
0 голосов
/ 20 августа 2009
Нос

будет прерван только при первой ошибке, если вы передадите опцию -x в командной строке.

test.py:

def test1():
    assert False

def test2():
    assert False

без опции -x:

C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py
FF
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
    self.test(*self.arg)
  File "C:\temp\py\test.py", line 2, in test1
    assert False
AssertionError

======================================================================
FAIL: test.test2
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
    self.test(*self.arg)
  File "C:\temp\py\test.py", line 5, in test2
    assert False
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.031s

FAILED (failures=2)

с опцией -x:

C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x
F
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
    self.test(*self.arg)
  File "C:\temp\py\test.py", line 2, in test1
    assert False
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.047s

FAILED (failures=1)

Возможно, вы захотите рассмотреть документацию носа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...