테스트 제어 Azure 함수 C 개발 # 섹션 3: 통합 테스트

이 문서에서 우리는 Azure 함수에 대해 단원 테스트를 어떻게 실현하는지 보았다.
단원 테스트는 우리가 피라미드를 테스트하는 기초를 구성하지만 TDD가 완성한 측면에서 볼 때 그것들은 아직 부족하다.
다음 단계에서는 Azure 기능을 위한 통합 테스트를 실시합니다.
 
이 시리즈의 기타 게시물


  • 섹션 3 - 본 약관
  • Github에 이 저장소를 만들었는데 이 저장소에는 이 블로그 시리즈에 사용되는 모든 관련 소스 코드가 포함되어 있습니다.

    sntnupl / azure 함수 예제 unittest integrationtest


    Azure 기능 어플리케이션에 대한 유닛 및 통합 테스트를 구현하는 방법을 보여주는 예제 어플리케이션


    이 기사의 관련 코드는 청구(Processor) 아래에 있습니다.시험이 저장소의 통합 항목입니다.
     

    image source
     
    이러한 통합 테스트와 셀 테스트를 구분하는 몇 가지 특징:
  • 서비스 버스에서 온 이벤트 트리거를 모의하지 않습니다.Azure 기능을 서비스 버스 주제의 실제 메시지에서 트리거합니다.
  • 우리는 Azure 함수로 Blob 스토리지의 IBinder을 읽는 것을 비웃지 않습니다. 실제 Blob 스토리지인
  • 을 사용하겠습니다.
  • Azure Sheet Storage IAsyncCollector을 비웃지 않습니다.우리는 Azure 함수를 사용하여 기록된 실제 테이블 저장소를 사용하고, 이 실제 테이블 저장소를 읽어서 이 기록을 검증할 것입니다.
  • 너는 이러한 장거를 실현하기 위해서 우리가 먼저 배경 작업을 해야 한다고 상상할 수 있다.
    이러한'배경 작업'을 상세하게 소개하기 전에 우리는 먼저 몇 가지 개념을 이해하자.
     

    Azure WebJobs SDK 및 Azure 기능과의 관계


    Azure Functions 응용 프로그램을 실행하면 콘솔 응용 프로그램이 시작됩니다.
    그러나 실제'기능'은 스스로 운행할 수 없고, 사건 촉발기를 신기하게 감청할 수 없다. 이것은 마력이 없는 것이다.이벤트 트리거를 감지하고 Azure 함수를 실행할 수 있는 실행 용기가 필요합니다.
    호스트에서 Azure Functions 애플리케이션을 시작하고 해당 주기를 관리합니다.또한 Azure Function 응용 프로그램에 대한 종속성 주입, 로깅 및 구성을 설정합니다.
    이 호스트는 Azure WebJobs SDK의 JobHost 클래스를 통해 구현됩니다(소스 코드 here).Azure 함수는 Azure WebJobs SDK package에 구축되어 있으며 이 JobHost 클래스를 사용할 수 있습니다.
    물론, 우리가 Azure Function 프로그램을 실현하고, 심지어는 그것을 실행할 때, JobHost과 관련된 모든 세부 사항은 우리에게서 추상화될 것이다.
    Azure Functions 프로젝트에서는 host.json 파일을 통해서만 호스트에 액세스할 수 있습니다.가능한 모든 호스트 설정의 전체 참조는 호스트를 통해 조정할 수 있습니다.json은 at this link에서 얻을 수 있습니다.
    따라서 우리가 이러한 관계를 이해하게 되면 통합 테스트 환경을 설정하기 위해
  • 호스트 호출
  • 에서 Azure 함수를 찾아
  • 을 로드하는 위치를 알려줍니다.
    이러한 지식을 통해 우리는 우리의 통합 테스트 프로젝트를 완성할 수 있다.
     

    Note: All code discussed in the following sections is in the InvoiceProcessor.Tests.Integration Project.


    설계 통합 테스트


    통합 테스트의 SUT는 InvoiceWorkitemEventHandler 클래스의 Azure 함수입니다.이 함수에는 기본적으로 세 가지 기능이 있습니다.
    새로운 메시지가 특정 Azure 서비스 버스 항목에 도달하면
  • 이 트리거되고 이 메시지가 확인되어 청구서가 업로드된 위치
  • 을 추출합니다.
  • 위 추출 위치에서 blob를 읽고 업로드된 영수증 파일
  • 의 내용을 분석
  • 마지막으로, Azure 테이블 스토리지
  • 에 컨텐츠를 특정 형식으로 저장합니다.
    따라서 우리의 통합 테스트는
  • Azure Blob 스토리지 컨테이너
  • 에 가상 청구서 파일 업로드
  • 위에서 만든 블로그의 위치로 메시지를 만들고 서비스 버스 테마에 전송합니다. 저희의 Azure 기능은
  • 을 감청하고 있습니다.
  • 마지막으로 Azure 테이블 저장소
  • 에 해당하는 항목을 만들 때까지 기다립니다
    그러나, 이 작업을 수행하기 전에, 우리의 테스트는 이전에 실행된 테스트의 모든 부품을 제거해야 한다.다시 말하면 다음과 같은 것이 필요하다.
  • 삭제 전 테스트에서는
  • 의 모든 Azure Blob 스토리지 컨테이너를 생성합니다.
  • 새 Azure Blob 스토리지 컨테이너를 만듭니다. 현재 실행 중인 테스트에서는
  • 을 사용합니다.
  • Azure 테이블 저장소에서 이전에 실행된 테스트에서 생성된 모든 항목을 삭제합니다.
  • 이러한 임무를 담당하는 실체는 EndToEndTestFixture류다.
    우리는 이 클래스에서 Class Fixture 모드를 이용하여 테스트 상하문을 만들 수 있습니다. 이 상하문은 ValidInvoiceTests 테스트 세트의 모든 테스트에서 공유됩니다.
    이 클래스는 xUnit의 IAsyncLifetime 인터페이스를 계승하여 비동기 설정 작업 during its initialization을 수행할 수 있도록 합니다.
     

    통합 테스트 작성


    배정 부분
    [Fact]
    public async Task ValidInvoiceUploaded_GetsParsedAndSavedToTableStorage()
    {
        string blobPath = await _testFixture.UploadSampleValidInvoice();
    
        // ...
    }
    
    다른 작업을 수행하기 전에 청구서 샘플 파일을 Azure Blob 저장소에 업로드하고 있습니다.
    [Fact]
    public async Task ValidInvoiceUploaded_GetsParsedAndSavedToTableStorage()
    {
        // ...
        IHost host = new HostBuilder()
            .ConfigureWebJobs()
            .ConfigureDefaultTestHost<InvoiceWorkitemEventHandler>(webjobsBuilder => {
                webjobsBuilder.AddAzureStorage();
                webjobsBuilder.AddServiceBus();
            })
            .ConfigureServices(services => {
                services.AddSingleton<INameResolver>(resolver);
            })
            .Build();
    
        using (host) {
            await host.StartAsync();
            // ..
        }
    
        // ...
    }
    
    이것은 Azure 기능이 포함된 호스트를 설정하는 부분입니다.
    구체적으로 말하면, 우리는 ConfigureDefaultTestHost<InvoiceWorkitemEventHandler>() 조수 방법을 사용하여 호스트가 InvoiceWorkitemEventHandler 클래스에서 Azure 함수를 찾도록 알려 주었다.
    Azure 스토리지(AddAzureStorage())와 ServiceBus(AddServiceBus()) 확장도 초기화했습니다. SUT에서 두 가지 확장을 사용했기 때문입니다.
    호스트를 생성한 후, 우리는 StartAsync()을 호출해서 호스트를 시작합니다.
     
    Act 섹션
    public async Task ValidInvoiceUploaded_GetsParsedAndSavedToTableStorage()
    {
        // ...
        using (host) {
            // ...
            await _testFixture.SendInvoiceWorkitemEvent(blobPath);
            // ...
        }
    }
    
    여기서, 우리는 영수증 파일의 위치를 업로드하는 메시지를 만들고, 이를 Azure 서비스 버스 테마에 보냅니다.
    이 메시지를 전송하면 SUT가 트리거되고 모든 것이 순조롭게 진행되면 Azure 테이블 저장소는 해당하는 항목을 사용하여 업데이트됩니다.
     
    단언 부분
    public async Task ValidInvoiceUploaded_GetsParsedAndSavedToTableStorage()
    {
        // ...
        using (host) {
            // ...
    
            List<AcmeOrderEntry> parsedOrders = await _testFixture.WaitForTableUpdateAndGetParsedOrders();
            _output.WriteLine($"Found {parsedOrders.Count} invoices.");
            Assert.True(parsedOrders.Count == 2);
        }
    }
    
    여기에서, 우리는 항목이 표 저장소에 업로드되기를 기다리고, 두 항목을 만들었다고 단언한다. (우리의 예시 영수증은 두 항목을 포함한다.)
    Unit 테스트를 실행하는 것과 마찬가지로 VisualStudio의 테스트 리소스 관리자를 사용하여 통합 테스트를 수행할 수도 있습니다.
     

    요약


    이 일련의 글에서 우리는 Azure 함수의 테스트 구동 개발을 어떻게 효과적으로 집행하는지 보았다.
    개발자들이 Azure 기능 측면에서 이 점을 걱정하는 것을 자주 본다.
    이러한 기능은 Azure Blob 스토리지, Azure 서비스 버스 등 외부 엔티티를 트리거하는 것과 관련된다는 사실에 따라 개발자들은 Unit/Integration 테스트 Azure 기능이 복잡한 작업이 될 것이라고 믿습니다.
    우리가 이 일련의 게시물에서 본 바와 같이, 이런 관점은 반드시 정확한 것은 아니다.
    이 시리즈는 Azure functions 응용 프로그램에서 TDD를 받아들일 수 있도록 도와주고 더 높은 품질의 코드를 제공함으로써 더 좋은 개발자가 되도록 도와주길 바랍니다.
    읽어주셔서 감사합니다!🙂

    좋은 웹페이지 즐겨찾기