프로바이더 테스트 작성

이 자습서는 프로바이더 테스트를 처음부터 작성하는 방법을 안내합니다. 이는 소비자 테스트 자습서의 연속입니다. 먼저, pact-ruby를 사용하여 프로바이더 테스트를 작성합니다. 이 자습서에서는 discussions.spec.js에 의해 생성된 계약을 다루는 프로바이더 테스트를 작성합니다. Pact는 소비자 중심의 테스트 도구이므로, 기존의 소비자 테스트에서 이미 생성된 계약이 있는 것으로 가정합니다.

뼈대 만들기

프로바이더 테스트는 매우 간단합니다. 목표는 테스트 데이터를 설정하고 해당 계약과 연결하는 것입니다. 먼저 spec/contracts/provider/pact_helpers/project/merge_request 아래에 get_discussions_helper.rb라는 파일을 만드세요. 이러한 파일들은 이 자습서의 끝에서 설정된 Rake 작업에서 어떻게 호출되는지와 일치하도록 하기 위해 helpers로 불립니다.

계약 테스트 디렉토리의 구조에 대한 자세한 정보는 테스트 스위트 폴더 구조를 참조하세요.

service_provider 블록

service_provider 블록은 프로바이더 테스트가 정의된 곳입니다. 이 블록에 대한 설명을 넣으세요. 이 블록은 소비자 테스트에서 파생된 계약에서 사용된 것과 정확히 동일하게 명명하세요.

require_relative '../../../spec_helper'

module Provider
  module DiscussionsHelper
    Pact.service_provider 'GET discussions' do

    end
  end
end

honours_pact_with 블록

honours_pact_with 블록은 이 프로바이더 테스트가 다루는 소비자를 설명합니다. service_provider 블록과 유사하게, 여기에 사용된 이름을 소비자 테스트에서 파생된 계약에서 사용된 것과 정확히 동일하게 명명하세요.

require_relative '../../../spec_helper'

module Provider
  module DiscussionsHelper
    Pact.service_provider 'GET discussions' do
      honours_pact_with 'MergeRequests#show' do

      end
    end
  end
end

소비자 및 프로바이더의 이름을 지정하는 방법에 대한 자세한 내용은 명명 규칙을 참조하세요.

테스트 앱 구성

계약을 확인하려면 프로바이더 테스트를 테스트 요청을 실제로 하고 해당 계약과 대조할 응답을 반환하는 테스트 앱에 연결해야 합니다. 이를 위해 테스트가 사용하는 appEnvironment::Test.app으로 구성하세요. 이는 spec/contracts/provider/environments/test.rb에서 정의됩니다.

require_relative '../../../spec_helper'

module Provider
  module DiscussionsHelper
    Pact.service_provider 'GET discussions' do
      app { Environment::Test.app }

      honours_pact_with 'MergeRequests#show' do

      end
    end
  end
end

확인할 계약 정의

이제 테스트 앱이 구성되었으므로, 남은 일은 이 프로바이더 테스트가 확인하는 계약을 정의하는 것입니다. pact_uri를 설정하여 이를 수행하세요.

require_relative '../../../spec_helper'

module Provider
  module DiscussionsHelper
    Pact.service_provider 'GET discussions' do
      app { Environment::Test.app }

      honours_pact_with 'MergeRequests#show' do
        pact_uri '../contracts/project/merge_requests/show/mergerequests#show-merge_request_discussions_endpoint.json'
      end
    end
  end
end

Rake 작업 추가/업데이트

테스트가 생성되었으므로, 이 테스트를 실행하는 Rake 작업을 만들어야 합니다. Rake 작업은 lib/tasks/contracts/merge_requests.rake에 정의되어 있습니다. 여기에는 개별 테스트를 실행하는 개별 Rake 작업과 테스트 그룹을 실행하는 Rake 작업이 모두 포함되어 있습니다.

contracts:merge_requests 네임스페이스에 이 새로운 테스트를 실행하는 Rake 작업을 소개하세요. 여기서 pact_uri를 호출하여 계약의 위치와 해당 계약을 테스트하는 프로바이더 테스트를 정의하세요. 여기서 pact_uri에는 pact_helper라는 매개변수가 있는데, 이것이 프로바이더 테스트가 _helper.rb로 불리는 이유입니다.

Pact::VerificationTask.new(:get_discussions) do |pact|
  provider = File.expand_path('../../../spec/contracts/provider', __dir__)
  pact_helper_location = "pact_helpers/project/merge_requests/show/get_discussions_helper.rb"

  pact.uri(
    Provider::ContractSourceHelper.contract_location(:rake, pact_helper_location),
    pact_helper: "#{provider}/#{pact_helper_location}"
  )
end

Provider::ContractSourceHelper#contract_location 메서드를 가지고 있는 도우미 모듈로, pact_helper_location을 구문 분석하고 requester에 따라 계약이 로컬에 저장되었는지 또는 Pact Broker에 있는지를 결정합니다.

동시에, :get_discussions Rake 작업을 test:merge_requests Rake 작업에 포함시켜야 합니다. 해당 Rake 작업에는 배열(%w[get_diffs_batch get_diffs_metadata])이 정의되어 있으며, 여기에 get_discussions를 추가해야 합니다.

테스트 데이터 생성

마지막 단계로, 프로바이더 테스트가 예상하는 응답을 생성할 수 있는 테스트 데이터를 생성하세요. 왜 테스트 데이터를 마지막에 생성하는지 궁금할 수 있습니다. 이는 실제로는 선호하는 문제입니다. 테스트가 이미 구성되었으므로 테스트를 쉽게 실행하여 예상되는 응답을 생성하는 데 필요한 모든 필수 테스트 데이터가 만들어졌는지 확인할 수 있습니다.

프로바이더 상태에 대해 더 읽어볼 수 있습니다. 우리는 전역 프로바이더 상태를 설정할 수 있지만, 이 자습서에서는 프로바이더 상태가 한 가지 특정 state를 위한 것입니다.

테스트 데이터를 만들기 위해 spec/contracts/provider/states/project/merge_requests 아래에 show_state.rb를 만드세요. get_discussions_helper.rb 파일에서 이 상태 파일도 가져와야 합니다.

spec/contracts/provider/spec_helper.rb에 있는 기본 사용자

테스트 데이터를 만들기 전에 spec_helper에 기본 사용자가 만들어집니다. 이 사용자는 테스트 실행에 사용되는 사용자입니다. 이 사용자는 RSpec.configure를 사용하여 구성됩니다. 이 단계를 통해 테스트 실행 전에 사용자를 구성할 수 있게 해줍니다.

RSpec.configure do |config|
  config.include Devise::Test::IntegrationHelpers
  config.include FactoryBot::Syntax::Methods

  config.before do
    user = create(:user, name: Provider::UsersHelper::CONTRACT_USER_NAME).tap do |user|
      user.current_sign_in_at = Time.current
    end

    sign_in user
  end
end

사용자의 추가 수정 사항은 각각의 프로바이더 상태 파일에서 수행할 수 있습니다.

provider_states_for 블록

상태 파일에서는이 공급자 상태가 어떤 컨슈머에 대한 것인지 정의해야 합니다. 이를 provider_states_for를 사용하여 수행할 수 있습니다. 제공된name이 컨슈머에 정의된 이름과 일치하는지 확인하십시오.

Pact.provider_states_for 'MergeRequests#show' do
end

provider_state 블록

그런 다음 provider_states_for 블록에서 테스트 데이터가 사용되는 상태를 정의합니다. 이러한 상태는 컨슈머 테스트에서도 정의됩니다. 이 경우에는 'a merge request with discussions exists' 상태가 있습니다.

Pact.provider_states_for "MergeRequests#show" do
  provider_state "a merge request with discussions exists" do

  end
end

set_up 블록

여기서 테스트 데이터 생성 단계를 정의합니다. 데이터 생성에는 FactoryBot을 사용합니다. 테스트 데이터를 생성하는 동안 공급자 테스트를 실행하여 테스트의 상태를 확인하고 데이터 설정에 빠진 부분을 찾을 수 있습니다.

Pact.provider_states_for "MergeRequests#show" do
  provider_state "a merge request with discussions exists" do
    set_up do
      user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME)
      namespace = create(:namespace, name: 'gitlab-org')
      project = create(:project, name: 'gitlab-qa', namespace: namespace)

      project.add_maintainer(user)

      merge_request = create(:merge_request_with_diffs, id: 1, source_project: project, author: user)

      create(:discussion_note_on_merge_request, noteable: merge_request, project: project, author: user)
    end
  end
end

테스트 데이터 사용

이제 공급자 상태 파일이 생성되었으므로 해당 상태 파일을 공급자 테스트로 가져와야 합니다.

# frozen_string_literal: true

require_relative '../../../spec_helper'
require_relative '../../../states/project/merge_requests/show_state'

module Provider
  module DiscussionsHelper
    Pact.service_provider "GET discussions" do
      app { Environments::Test.app }

      honours_pact_with 'Merge Request#show' do
        pact_uri '../contracts/project/merge_requests/show/mergerequests#show-merge_request_discussions_endpoint.json'
      end
    end
  end
end

그리고 이로써, get_discussions_helper.rb의 공급자 테스트는 이제 통과해야 합니다.