17

私はSpockを使用していて、複数の入力と出力を使用してテストケースを簡単に実行できる「where」句が大好きでした。例えば:

class HelloSpock extends spock.lang.Specification {
    def "length of Spock's and his friends' names"() {
        expect:
            name.size() == length

        where:
            name     | length
            "Spock"  | 5
            "Kirk"   | 4
            "Scotty" | 6
    }
} 

Pythonに似たものはありますか?

4

6 に答える 6

12

はいあります!

私はNimoyの作者です-Python用のSpockになることを目的として構築されたフレームワークです。

データ駆動型テストを作成できます。

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

あなたはモックを上演することができます:

from unittest import mock
from nimoy.specification import Specification

class MySpec(Specification):

    def my_feature_method(self):
        with setup:
            the_mock = mock.Mock()

        with when:
            the_mock.some_method() << [5, 6, 7]

        with then:
            the_mock.some_method() == 5
            the_mock.some_method() == 6
            the_mock.some_method() == 7

また、かなりモックなアサーションもあります。

from unittest import mock
from nimoy.specification import Specification

class MySpec(Specification):

    def my_feature_method(self):
        with setup:
            the_mock = mock.Mock()

        with when:
            the_mock.some_method('abcd', True)

        with then:
            1 * the_mock.some_method('abcd', True)
于 2019-10-24T08:12:54.103 に答える
5

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
于 2012-06-12T10:15:14.973 に答える
5

私はJava/Groowyの世界でSpockフレームワークの大ファンでもあります。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

そして、なぜそれが生まれたのかという著者のブログ投稿もあります。

于 2019-05-12T21:45:38.860 に答える
3

テストが数個以上ある場合は、behaveのようなBDDフレームワークをお勧めしますGherkin構文を指定します。例:(リンクされたチュートリアルのコード):

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コードの記述はかなり簡単で、オンラインには多数の定型コードの例があります。この手法の利点は、テストスイートが非常に再利用可能であり、プログラマー以外の人でも非常に簡単に拡張できることです。

于 2014-02-01T17:10:09.470 に答える
2

いいえ、ありません。スポックは本当に素晴らしいので、それは悲しいことです。私は今1年を探していて、PythonでそのようなDSLを作成するのに何が必要かを考えました。

BehaveとLettuceは、BDDスタイルの構文とイディオムを取得しますが、シナリオファイルに一致する個別のステップファイルを維持する必要があります。明らかに、これはTDDを実行したいが、Spockが可能にするBDDの可読性を持っている場合には役に立ちません。

スポックスタイルのモックも必要な場合は、 Moxが最も近いものです。しかし、スポックに甘やかされてしまうと、これも代用にはなりません。

于 2015-08-31T19:19:51.307 に答える
0

それを行うための新しいpytestプラグインがあります:https ://github.com/zen-xu/spock

ドキュメントから抜粋したテスト関数の例を次に示します。

@pytest.mark.spock("{a} > {b}")
def test_bigger():
    def expect(a, b):
        assert a > b

    def where(_, a, b):
        _ | a | b
        _ | 7 | 3
        _ | 5 | 2

私はあなたが内部のpythonメソッドを使うことができる方法が好きです、ドキュメントは明確で使いやすいです。

于 2021-11-04T06:03:40.367 に答える