С недавнего времени осваиваю Python, до этого активно истользовал в тестировании связку Java+TestNG
Просмотрел несколько тествых фрейморков (nose, py.test), и так и не понял, как оргазавать тестовый сьют.
Привычная для меня структура была приблизительно такой (исходя из TestNg):
Тестовый сьют - XML, в котором собраны тестовый классы. 1 Класс = 1 Тест.
Тестовый класс состоит из тестовых медодов, которые впринципе соответствуют тест степам.
Не могу понять как мне сделать подобное в питоне… что будет эквивалентом тестового класса со степами, и как собрать их в сьют…
P.S. мне необходимо будет написать свой плагин, который будет реагировать не события типа:
onTestSuiteStart
onTestCaseStart
onTestStepStart
onTestSuiteFinished и так далее… поэтому тесты надо как-то группировать и нельзя скидывать в общий котел…
Просто интересно, почему решили осваивать python после уже активного использования Java?
Ну тут есть как общие моменты так и отличия. В общем если говорить за unittest, это самая приближенная нативная реализация в Python. Я подскажу быстро и по беглому. Вы глядит она где-то так:
from tests import TestClass
import unittest
def suite():
suite = unittest.TestSuite()
#suite.addTest(TestClass())
#suite.addTest(TestClass("test_something"))
suite.addTest(unittest.makeSuite(TestClass))
return suite
if __name__ == '__main__':
unittest.main()
А если мы говорим о nose или py.test, то там нужно просто писать функции в модуле или методы в классе, которые соответствуют конвенции и они без проблем будут запускаться.
Пример:
nose
def setup_func():
"set up test fixtures"
def teardown_func():
"tear down test fixtures"
@with_setup(setup_func, teardown_func)
def test():
"test ..."
А если вы с Java перешли, то вам будет близок вот этот проект proboscisProboscis — proboscis 1.0 documentation. Практически TestNG только на python. Пример кода:
import unittest
from proboscis.asserts import assert_equal
from proboscis import test
import utils
@test(groups=["unit", "numbers"])
class TestIsNegative(unittest.TestCase):
"""Confirm that utils.is_negative works correctly."""
def test_should_return_true_for_negative_numbers(self):
self.assertTrue(utils.is_negative(-47))
def test_should_return_false_for_positive_numbers(self):
self.assertFalse(utils.is_negative(56))
def test_should_return_false_for_zero(self):
self.assertFalse(utils.is_negative(0))
def run_tests():
from proboscis import TestProgram
from tests import unit
# Run Proboscis and exit.
TestProgram().run_and_exit()
if __name__ == '__main__':
run_tests()
$ python run_tests.py
test_should_return_false_for_positive_numbers (examples.unit.tests.unit.TestIsNegative) ... ok
test_should_return_false_for_zero (examples.unit.tests.unit.TestIsNegative) ... ok
test_should_return_true_for_negative_numbers (examples.unit.tests.unit.TestIsNegative) ... ok
Make sure our complex string reversal logic works. ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
Осваивать решил для раскачки собственных скилов и нынешней популярности питона… По поводу сбора вроде как понятно - спасибо…
За пробоскис спасибо, я его уже поковывырял, но опять же я не нашел того что мне надо…
Дело в том, что пробоскискис сделан на основе nose… Для того чтобы написать слушатель тестов для nose, я наследуюсь от класса Plugin, переопределяю нужные методы и вроде как все хорошо… Но в интерфейсе nose плагина, я совсем не нахожу методов, которые срабатывают при старте тестового сьюта/класса… Реакция есть только на “тест”… (Passed, Failture, Error)… Т.е. мне бы собрать отчет, в духе…
Именно чтобы в нем отражалась информация о стуктуре тестов, и можно было бы понять Когда начался сьют, когда он закончился, когда начался тест, и когда он закончился… И собрать эту штуку нужно руками, потому как он собирается на удаленном сервере, при помощи отправки соответствующих http запросов…
Для того чтобы разобраться, что можно использовать nose смотреть в базоый класс интерфейс для плагинов, может быть найдете, то что вам нужно. Находится он тут c:\Program Files (x86)\Python27\Lib\site-packages\nose\plugins\base.py
А для того, чтобы посмотреть как это все можно использовать, просто берите один из плагинов и смотри исходный код. Самый подходящий наверное будет junitxml.py c:\Program Files (x86)\Python27\Lib\site-packages\_pytest\junitxml.py
вообще как огранизовывают высокоуровневые (селениум) тесты на питоне ? смысл же том, что даже при условиии запуска через grid, UI - тесты порой очень долгие… и еще бОльшоая проблема - зависимости очень важны… если срывается какой-то степ, нет смысла мучать UI следующими двумя… это конечно решаемо, как я понял, с помощью пробоскиса, а что насчет py.test -а ?
В python тесты организовывают по другому. Через пакеты, директории, названия файлов и теги в тестах, ну и в зависимости от фреймворка. Но это отдельная история.
Встроенных механизмов зависимостей нет. Тут придется или другие фреймворки искать, или самому доделывать.