プログラミングのフィクスチャとは何ですか?


191

私はこの用語を何度も聞いたことがありますが(プログラミングの文脈では)、それが何を意味するのかについての説明は見つかりませんでした。良い記事や説明はありますか?

回答:


195

あなたはテストフィクスチャを参照していると思います:

テストフィクスチャの目的は、テストを実行して結果を再現できるようにする、よく知られた固定された環境があることを確認することです。これをテストコンテキストと呼ぶ人もいます。

フィクスチャーの例:

  • 特定の既知のデータセットを含むデータベースの読み込み
  • ハードディスクの消去と既知のクリーンなオペレーティングシステムのインストール
  • 特定の既知のファイルセットのコピー
  • 入力データの準備と、偽または模擬オブジェクトのセットアップ/作成

(出典:ウィキペディア、上記のリンクを参照)

以下は、「Googleテスト」フレームワークのドキュメントからの実用的な例です。


13

PHPユニットのテストは、これを非常によく説明していると思います。

テストの記述で最も時間がかかる部分の1つは、コードを記述して世界を既知の状態に設定し、テストが完了すると元の状態に戻すことです。この既知の状態は、テストのフィクスチャと呼ばれます。

また、Yiiのドキュメントには、良好な形のフィクスチャテストが記載されています。

自動テストは何度も実行する必要があります。テストプロセスを繰り返し可能にするために、フィクスチャと呼ばれる既知の状態でテストを実行したいと思います。たとえば、ブログアプリケーションで投稿作成機能をテストするには、テストを実行するたびに、投稿に関する関連データを格納するテーブル(たとえば、投稿テーブル、コメントテーブル)を一定の状態に復元する必要があります。

ここでフィクスチャテストの簡単な例

<?php
use PHPUnit\Framework\TestCase;

class StackTest extends TestCase
{
    protected $stack;

    protected function setUp()
    {
        $this->stack = [];
    }

    protected function tearDown()
    {
        $this->stack = [];
    }

    public function testEmpty()
    {
        $this->assertTrue(empty($this->stack));
    }

    public function testPush()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', $this->stack[count($this->stack)-1]);
        $this->assertFalse(empty($this->stack));
    }

    public function testPop()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', array_pop($this->stack));
        $this->assertTrue(empty($this->stack));
    }
}
?>

このPHPユニットテストには名前の付いた関数がsetUpありtearDown、テストを実行する前にデータを設定し、終了したらそれらを初期状態に復元できます。


7

フィクスチャという用語は、コンテキスト、プログラミング言語、またはフレームワークによって異なります。

1.テストが実行されている既知の状態

テストの記述で最も時間がかかる部分の1つは、コードを記述して世界を既知の状態に設定し、テストが完了すると元の状態に戻すことです。この既知の状態は、テストのフィクスチャと呼ばれます。 PHPユニットのドキュメント

テストフィクスチャ(テストコンテキストとも呼ばれます)は、テストを実行するために必要な前提条件または状態のセットです。開発者は、テスト前に既知の良好な状態を設定し、テスト後に元の状態に戻す必要があります。 ウィキペディア(xUnit)

2.サンプルデータを含むファイル

Fixturesは、サンプルデータのファンシーワードです。フィクスチャを使用すると、テストを実行する前に、テストデータベースに事前定義されたデータを入力できます。フィクスチャはデータベースに依存せず、YAMLで記述されています。モデルごとに1つのファイルがあります。 RubyOnRails.org

3.必要な状態を設定するプロセス。 

ソフトウェアテストフィクスチャは、システムを初期化するために必要なすべてのコードを提供することにより、テストプロセス用にシステムをセットアップします。例としては、テストを実行する前に、顧客サイトから既知のパラメーターを含むデータベースをロードすることが考えられます。 ウィキペディア


5

まさにそのトピックについて、JUnitにはよく説明されたドキュメントがあります。リンクはこちら

記事の関連部分は次のとおりです。

テストは、既知のオブジェクトセットのバックグラウンドに対して実行する必要があります。このオブジェクトのセットは、テストフィクスチャと呼ばれます。テストを作成しているとき、実際に値をテストするよりも、フィクスチャを設定するためのコードの作成に多くの時間を費やすことに気付くでしょう。

ある程度までは、作成するコンストラクターに細心の注意を払うことで、フィクスチャーコードを簡単に作成できます。ただし、フィクスチャコードを共有することで、大幅に節約できます。多くの場合、同じフィクスチャをいくつかの異なるテストに使用できます。それぞれのケースは、わずかに異なるメッセージまたはパラメーターをフィクスチャーに送信し、異なる結果をチェックします。

共通のフィクスチャがある場合は、次のようにします。

フィクスチャの各部分にフィールドを追加します@ org.junit.Beforeでメソッドに注釈を付け、そのメソッドの変数を初期化します@ org.junit.Afterでメソッドに注釈を付けますsetUpで割り当てた永久リソースを解放しますたとえば、 12スイスフラン、14スイスフラン、28米ドルのさまざまな組み合わせで機能するいくつかのテストケースでは、まずフィクスチャを作成します。

public class MoneyTest {
    private Money f12CHF;
    private Money f14CHF;
    private Money f28USD;

    @Before public void setUp() {
    f12CHF= new Money(12, "CHF");
    f14CHF= new Money(14, "CHF");
    f28USD= new Money(28, "USD");
    }
}

2

Xamarin.UITestでは、次のように説明されています。

通常、各Xamarin.UITestは、テストと呼ばれるメソッドとして記述されます。テストを含むクラスは、テストフィクスチャと呼ばれます。テストフィクスチャには、単一のテストまたはテストの論理グループのいずれかが含まれ、テストを実行するためのセットアップと、テストの終了時に実行する必要があるクリーンアップを担当します。各テストは、Arrange-Act-Assertパターンに従う必要があります。

  • 配置–テストは条件を設定し、テストを実行できるように初期化します。
  • Act –テストはアプリケーションと対話し、テキストを入力し、ボタンを押すなどします。
  • アサート–テストでは、Actステップで実行されたアクションの結果を調べて、正確性を判断します。たとえば、アプリケーションは特定のエラーメッセージが表示されることを確認します。

上記抜粋のオリジナル記事へのリンク

Xamarin.UITestコード内では、次のようになります。

using System;
using System.IO;
using System.Linq;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;

namespace xamarin_stembureau_poc_tests
{
    [TestFixture(Platform.Android)]
    [TestFixture(Platform.iOS)]
    public class TestLaunchScreen
    {
        IApp app;
        Platform platform;

        public Tests(Platform platform)
        {
            this.platform = platform;
        }

        [SetUp]
        public void BeforeEachTest()
        {
            app = AppInitializer.StartApp(platform);
        }

        [Test]
        public void AppLaunches()
        {
            app.Screenshot("First screen.");
        }

        [Test]
        public void LaunchScreenAnimationWorks()
        {
            app.Screenshot("Launch screen animation works.");
        }
    }
}

これがプログラミングにおけるフィクスチャについてより良い理解を求めている人に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.