

# C\$1 での AWS Lambda 関数テスト
<a name="dotnet-csharp-testing"></a>

**注記**  
サーバーレスソリューションをテストするための手法とベストプラクティスの詳細については、「[関数のテスト](testing-guide.md)」の章を参照してください。

 サーバーレス関数のテストでは、従来のテストタイプと手法を使用しますが、サーバーレスアプリケーション全体のテストも検討する必要があります。クラウドベースのテストでは、関数とサーバーレスアプリケーションの両方の品質を**最も正確に**測定できます。

 サーバーレスアプリケーションアーキテクチャには、API 呼び出しを通じて重要なアプリケーション機能を提供するマネージドサービスが含まれます。このため、開発サイクルには、関数とサービスが相互に作用する際に機能を検証する自動テストを含める必要があります。

 クラウドベースのテストを作成しない場合、ローカル環境とデプロイされた環境の違いにより問題が発生する可能性があります。継続的な統合プロセスでは、コードをQA、ステージング、本番稼働などの次のデプロイ環境に昇格する前に、クラウドにプロビジョニングされた一連のリソースに対してテストを実行する必要があります。

 サーバーレスアプリケーションのテスト戦略に関する詳細については、このショートガイドを引き続きご覧ください。また、[サーバーレステストサンプルリポジトリ](https://github.com/aws-samples/serverless-test-samples)にアクセスして、選択した言語とランタイムに固有の実用的な例を調べることもできます。

 ![\[illustration showing the relationship between types of tests\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-type-illustration2.png) 

 サーバーレステストの場合も、*ユニット*テスト、*統合*テスト、*エンドツーエンド*テストを書くことになります。
+ **ユニットテスト** - 分離されたコードブロックに対して実行されるテスト。例えば、特定の商品と配送先を指定して配送料を計算するビジネスロジックを検証する場合です。
+ **統合テスト** - 通常はクラウド環境で相互作用する 2 つ以上のコンポーネントまたはサービスを対象としたテスト。例えば、キューからのイベントを処理する関数を検証する場合です。
+ **エンドツーエンドテスト** - アプリケーション全体の動作を検証するテスト。例えば、インフラストラクチャが正しくセットアップされ、顧客の注文を記録するためにイベントがサービス間で想定どおりに流れることを確認する場合です。

## サーバーレスアプリケーションのテスト
<a name="dotnet-csharp-testing-techniques-for-serverless-applications"></a>

 通常、サーバーレスアプリケーションコードのテストには、クラウドでのテスト、モックを使ったテスト、場合によってはエミュレーターでのテストなど、さまざまな方法を組み合わせます。

### クラウドでのテスト
<a name="dotnet-csharp-testing-in-the-cloud"></a>

 クラウドでのテストは、ユニットテスト、統合テスト、エンドツーエンドテストなど、テストのあらゆる段階で役立ちます。クラウドにデプロイされたコードやクラウドベースのサービスとやり取りするコードに対してテストを実行します。この方法では、コードの品質を**最も正確に**測定できます。

 クラウドで Lambda 関数をデバッグする便利な方法は、コンソールからテストイベントを行うことです。*テストイベント*とは、関数への JSON 入力のことです。関数が入力を必要としない場合、イベントは空の JSON ドキュメント `({})` にすることができます。コンソールには、さまざまなサービス統合のサンプルイベントが用意されています。コンソールでイベントを作成したら、それをチームと共有して、テストを簡単かつ一貫性のあるものにすることができます。

**注記**  
[コンソールで関数をテストする](testing-functions.md)のが簡単な方法ですが、テストサイクルを自動化することでアプリケーションの品質と開発スピードが保証されます。

### テストツール
<a name="dotnet-csharp-testing-tools"></a>

開発サイクルを能率化するために、関数のテスト時に使用できるツールやテクニックは数多くあります。例えば、[AWS SAM Accelerate](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-sync.html) と [AWS CDK 監視モード](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch)は、いずれもクラウド環境の更新に要する時間を短縮します。

Lambda 関数コードを定義する方法により、ユニットテストを簡単に追加できます。Lambda では、クラスを初期化するためのパラメータなしのパブリックコンストラクタが必要です。2 つ目の内部コンストラクタを導入すると、アプリケーションが使用する依存関係を制御できるようになります。

```
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace GetProductHandler;

public class Function
{
    private readonly IDatabaseRepository _repo;
    
    public Function(): this(null)
    {
    }
    
    internal Function(IDatabaseRepository repo)
    {
        this._repo = repo ?? new DatabaseRepository();
    }
    
    public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request)
    {
        var id = request.PathParameters["id"];
        
        var databaseRecord = await this._repo.GetById(id);
        
        return new APIGatewayProxyResponse 
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = JsonSerializer.Serialize(databaseRecord)
        };
    }
}
```

この関数のテストを作成するには、`Function` クラスの新しいインスタンスを初期化し、`IDatabaseRepository` のモック実装を渡します。以下の例では、`XUnit`、`Moq`、`FluentAssertions` を使用して、`FunctionHandler` がステータスコード 200 を返すことを確認する簡単なテストを記述しています。

```
using Xunit;
using Moq;
using FluentAssertions;

public class FunctionTests
{
    [Fact]
    public async Task TestLambdaHandler_WhenInputIsValid_ShouldReturn200StatusCode()
    {
        // Arrange
        var mockDatabaseRepository = new Mock<IDatabaseRepository>();
        
        var functionUnderTest = new Function(mockDatabaseRepository.Object);
        
        // Act
        var response = await functionUnderTest.FunctionHandler(new APIGatewayProxyRequest());
        
        // Assert
        response.StatusCode.Should().Be(200);
    }
}
```

非同期テストの例を含む詳細な例については、GitHub の「[.NET testing samples repository](https://github.com/aws-samples/serverless-test-samples/tree/main/dotnet-test-samples)」を参照してください。