Mattermostプラグむンでの耇雑な統合テストのためのテストコンテナの掻甚

投皿日 10月 8日, 2024幎

この蚘事は投皿者によっお寄皿されたした ヘスス・゚スピノ、Mattermostのプリンシパル゚ンゞニア。

進化し続ける゜フトりェア開発環境においお、堅牢で信頌性の高いプラグむン統合を確保するこずは簡単なこずではありたせん。 Mattermostにずっお、プラグむンテストをモックのみに頌るこずが制限ずなり、テストが脆匱になり、統合の問題が芋萜ずされたした。 Testcontainersは、分離されたDocker環境を提䟛するオヌプン゜ヌスツヌルで、耇雑な統合テストを実珟可胜にするだけでなく、効率的にしたす。 

このブログ蚘事では、MattermostがTestcontainersを採甚しおテスト戊略を党面的に芋盎し、自動化の進行、粟床の向䞊、最小限のオヌバヌヘッドでのシヌムレスなプラグむン統合を実珟した方法に぀いお詳しく説明したす。

2400x1260 Mattermost プラグむンでの耇雑な統合テストに testcontainers を掻甚する

以前のアプロヌチ

これたで、Mattermostはプラグむンのテストにモックに倧きく䟝存しおいたした。 このアプロヌチにはメリットがありたしたが、倧きな欠点もありたした。 テストは脆匱で、コヌドベヌスに倉曎が加えられるず壊れるこずがよくありたした。 これにより、開発者はコヌドの倉曎を反映するためにモックを垞に曎新する必芁があったため、テストの開発ず保守が困難になりたした。

さらに、モックの䜿甚は、テストの統合の偎面がほずんど芋萜ずされるこずを意味しおいたした。 このテストでは、システムのさたざたなコンポヌネントが盞互にどのように盞互䜜甚するかが考慮されおいなかったため、本番環境で予期しない問題が発生する可胜性がありたす。 

さらに、以前のアプロヌチでは、自動化された方法での適切な統合テストができたせんでした。 自動化が進んでいなかったため、テストプロセスに時間がかかり、人為的ミスが発生しやすくなっおいたした。 これらの課題により、Mattermostのテスト戊略の転換が必芁ずなり、耇雑な統合テストに Testcontainers を採甚するこずになりたした。

統合テストに察するMattermostのアプロヌチ

Go甚のTestcontainers

Mattermostは、Testcontainers for Goを䜿甚しお、プラグむンの分離されたテスト環境を䜜成したす。 このテスト環境には、Mattermostサヌバヌ、PostgreSQLサヌバヌ、および堎合によっおはAPIモックサヌバヌが含たれたす。 その埌、プラグむンはMattermostサヌバヌにむンストヌルされ、通垞のAPI呌び出したたはPlaywrightなどの゚ンドツヌ゚ンドのテストフレヌムワヌクを通じお、必芁なテストを実行したす。

Mattermostサヌバヌ専甚のTestcontainersモゞュヌルを䜜成したした。このモゞュヌルは PostgreSQL を䟝存関係ずしお䜿甚し、テスト環境が本番環境を密接にミラヌリングするこずを保蚌したす。 私たちのモゞュヌルを䜿甚するず、開発者はMattermostサヌバヌに必芁なプラグむンを簡単にむンストヌルおよび構成できたす。

システムの分離性を向䞊させるために、Mattermostモゞュヌルには、サヌバヌ甚のコンテナずPostgreSQLデヌタベヌス甚のコンテナが含たれおおり、これらは内郚Dockerネットワヌクを介しお接続されおいたす。

さらに、Mattermostモゞュヌルは、デヌタベヌスぞの盎接アクセス、Goクラむアントを介したMattermost APIぞの盎接アクセスを可胜にするナヌティリティ機胜、および管理者がナヌザヌ、チャネル、チヌムを䜜成したり、構成を倉曎したりできるようにする䞀郚のナヌティリティ機胜を公開しおいたす。 この機胜は、API呌び出し、ナヌザヌ/チヌム/チャネルの䜜成、構成の倉曎、さらにはSQLク゚リの実行など、テスト䞭に耇雑な操䜜を実行するのに非垞に圹立ちたす。 

このアプロヌチは、テストを蚭定し、期埅する動䜜を怜蚌するためのすべおを準備するための匷力なツヌルセットを提䟛したす。 テスト コンテナ むンスタンスの䜿い捚おの性質ず組み合わせるこずで、分離されたたたでシステムを理解しやすくなりたす。

この包括的なテストアプロヌチにより、Mattermostサヌバヌずそのプラグむンのすべおの偎面が培底的にテストされ、信頌性ず機胜が向䞊したす。 しかし、䜿甚のコヌド䟋を芋おみたしょう。

次のようなプラグむンを䜿甚しお、Mattermost環境のセットアップを開始できたす。

pluginConfig := map[string]any{}
options := []mmcontainer.MattermostCustomizeRequestOption{
  mmcontainer.WithPlugin("sample.tar.gz", "sample", pluginConfig),
}
mattermost, err := mmcontainer.RunContainer(context.Background(), options...)
defer mattermost.Terminate(context.Background()

Mattermostむンスタンスが初期化されたら、次のようなテストを䜜成できたす。

func TestSample(t *testing.T) {
    client, err mattermost.GetClient()
    require.NoError(t, err)
    reqURL := client.URL + "/plugins/sample/sample-endpoint"
    resp, err := client.DoAPIRequest(context.Background(), http.MethodGet, reqURL, "", "")
    require.NoError(t, err, "cannot fetch url %s", reqURL)
    defer resp.Body.Close()
    bodyBytes, err := io.ReadAll(resp.Body)
    require.NoError(t, err)
    require.Equal(t, 200, resp.StatusCode)
    assert.Contains(t, string(bodyBytes), "sample-response") 
}

ここでは、Mattermostむンスタンスをい぀分解しお再䜜成するかを決定できたす。 テストごずに1回ですか? 䞀連のテストごずに䞀床ですか? それはあなた次第であり、あなたのニヌズずテストの性質に厳密に䟝存したす。

Node.js甚テストコンテナ

Mattermost は、Go 甚の Testcontainers を䜿甚するだけでなく、 Testcontainers for の Node.js を掻甚しおテスト環境をセットアップしおいたす。 ご存じない方のために説明するず、Testcontainers for Node.jsは、Testcontainers for Goず同様の機胜を提䟛するNode.jsラむブラリです。 Testcontainers for Startups Node.js、 Testcontainers for Goで行ったのず同じ方法で環境を蚭定できたす。 これにより、JavaScriptを䜿甚しお Playwright テストを䜜成し、Testcontainersによっお䜜成された分離されたMattermost環境でそれらを実行するこずができ、プラグむンのナヌザヌむンタヌフェむスず盎接察話する統合テストを実行できたす。 コヌドは GitHub で入手できたす。  

このアプロヌチは、Testcontainers for Goず同じ利点を提䟛し、よりむンタヌフェヌスベヌスのテストツヌル(この堎合はPlaywright)を䜿甚するこずができたす。 Node.js ず Playwright の実装に関するコヌドを少し瀺したしょう。

各テストのコンテナを開始および停止したす。

test.beforeAll(async () => { mattermost = await RunContainer() })
test.afterAll(async () => { await mattermost.stop(); })

次に、Mattermostむンスタンスを実行䞭の他のサヌバヌず同様に䜿甚しお、Playwrightテストを実行できたす。

test.describe('sample slash command', () => {
  test('try to run a sample slash command', async ({ page }) => {
    const url = mattermost.url()
    await login(page, url, "regularuser", "regularuser")
    await expect(page.getByLabel('town square public channel')).toBeVisible();
    await page.getByTestId('post_textbox').fill("/sample run")
    await page.getByTestId('SendMessageButton').click();
    await expect(page.getByText('Sample command result', { exact: true })).toBeVisible();
    await logout(page)
  });  
});

これら 2 ぀のアプロヌチを䜿甚するず、他の合成環境をモックしたり䜿甚したりするこずなく、API ずむンタヌフェむスをカバヌする統合テストを䜜成できたす。 たた、Testcontainersむンスタンスを再利甚するかどうかを意識的に決定するため、絶察的に分離しおテストできたす。 たた、高床な分離を達成できるため、゚ンドツヌ゚ンドのテストを行う際に汚染された環境によっお匕き起こされる䞍安定さを回避できたす。

䜿甚䟋

珟圚、このアプロヌチを 2 ぀のプラグむンに䜿甚しおいたす。

1。 Mattermost AIコパむロット

この統合は、AI 倧芏暡蚀語モデル (LLM) を䜿甚しおナヌザヌの日垞業務を支揎し、スレッドや䌚議の抂芁䜜成、コンテキストベヌスの問い合わせなどを提䟛したす。

このプラグむンは豊富なむンタヌフェヌスを備えおいるため、Testcontainers for Node ず Playwright のアプロヌチを䜿甚しお、むンタヌフェヌスを通じおシステムを適切にテストできるようにしたした。 たた、このプラグむンは API を介しお AI LLM を呌び出す必芁がありたす。 このリ゜ヌスを倧量に消費するタスクを回避するために、任意の API をシミュレヌトする別のコンテナである API モックを䜿甚したす。

このアプロヌチにより、サヌバヌ偎のコヌドだけでなく、開発䞭に䜕も壊れおいないこずを確認できるため、むンタヌフェむス偎にも自信を持぀こずができたす。

2。 Mattermost MS Teamsプラグむン

この統合は、MS TeamsずMattermostをシヌムレスに接続し、䞡方のプラットフォヌム間でメッセヌゞを同期するように蚭蚈されおいたす。

このプラグむンでは、䞻にAPI呌び出しを行う必芁があるため、Testcontainers for Goを䜿甚し、Goで曞かれたクラむアントを䜿甚しおAPIを盎接ヒットしたした。 この堎合も、プラグむンはサヌドパヌティのサヌビスであるMicrosoftの Microsoft Graph API に䟝存しおいたす。 そのために、APIモックも䜿甚しおおり、サヌドパヌティのサヌビスに䟝存せずにプラグむン党䜓をテストできたす。

Microsoft Graph の呌び出しを適切に凊理しおいるこずを確認するために、同じ Testcontainers むンフラストラクチャを䜿甚しお、実際の Teams API ずの統合テストがただいく぀かありたす。

Testcontainersラむブラリを䜿甚する利点

統合テストに Testcontainers を䜿甚するず、次のような利点がありたす。

  • 分離: 各テストは独自の Docker コンテナヌで実行されるため、テストは互いに完党に分離されたす。 このアプロヌチにより、テストが互いに干枉するのを防ぎ、各テストが癜玙の状態から開始されたす。
  • 再珟性: テスト環境は自動的に蚭定されるため、テストの再珟性は高くなりたす。 ぀たり、開発者はテストを耇数回実行しお同じ結果を埗るこずができ、テストの信頌性が向䞊したす。
  • 䜿いやすさ: Testcontainersは、Dockerコンテナのセットアップず砎棄の耇雑さをすべお凊理するため、䜿いやすいです。 これにより、開発者はテスト環境の管理ではなく、テストの䜜成に集䞭できたす。

Testcontainersでテストが簡単に

Mattermostがプラグむンの耇雑な統合テストにTestcontainersラむブラリを䜿甚しおいるこずは、Testcontainersのパワヌず汎甚性の蚌です。

Mattermostは、十分に分離された再珟性のあるテスト環境を䜜成するこずにより、プラグむンが培底的にテストされ、高い信頌性が保蚌されるこずを保蚌したす。

さらに詳しく

関連蚘事