Ответ 1
pytest позволяет параметризовать тестовую функцию:
import pytest
@pytest.mark.parametrize(("input", "expected"), [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(input, expected):
assert eval(input) == expected
Я работал со Спок и любил предложение "where", которое позволяет вам легко выполнять тестовый пример с несколькими входами и выходами. Например:
class HelloSpock extends spock.lang.Specification {
def "length of Spock and his friends' names"() {
expect:
name.size() == length
where:
name | length
"Spock" | 5
"Kirk" | 4
"Scotty" | 6
}
}
Есть ли что-то подобное для Python?
pytest позволяет параметризовать тестовую функцию:
import pytest
@pytest.mark.parametrize(("input", "expected"), [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(input, expected):
assert eval(input) == expected
Если у вас более нескольких тестов, я бы рекомендовал структуру BDD, например behave. Вы указываете синтаксис Герхарна, например (код из связанного учебника):
Scenario: some scenario
Given a set of specific users
| name | department |
| Barry | Beer Cans |
| Pudey | Silly Walks |
| Two-Lumps | Silly Walks |
When we count the number of people in each department
Then we will find two people in "Silly Walks"
But we will find one person in "Beer Cans"
И код Python для его синтаксического анализа, например:
@given('a set of specific users')
def step_impl(context):
for row in context.table:
model.add_user(name=row['name'], department=row['department'])
Написание кода Python довольно просто, и в Интернете есть многочисленные примеры шаблонов. Красота в этом методе заключается в том, что ваш набор тестов очень многократно используется и может быть легко продлен не программистами.
Нет, нет. Что печально, потому что Спок действительно превосходный. Я искал год и размышлял над тем, что потребуется, чтобы создать такой DSL на python, так как я так скучаю по нему.
Behave и Lettuce получат вам синтаксис и идиомы стиля BDD, но вы должны поддерживать отдельные файлы шагов, соответствующие файлам сценария. Очевидно, что это отстой, когда вы хотите сделать TDD, но иметь читаемость BDD, что позволяет Spock.
Если вы также хотите, чтобы стиль стиля Spock был таким, Mox является ближайшим, который я нашел. Но опять же это плохая замена, как только вы испорчены Споком.
Я также большой поклонник фреймворка Спока в мире Java/Groowy. В поиске похоже на Python. В своих поисках я нашел Нимой, которая выглядит очень многообещающе.
Пример с официальной страницы:
from nimoy.specification import Specification
class MySpec(Specification):
def my_feature_method(self):
with given:
a = value_of_a
b = value_of_b
with expect:
(a * b) == expected_value
with where:
value_of_a | value_of_b | expected_value
1 | 10 | 10
2 | 20 | 40
И там также автор сообщения в блоге, почему он родился.