프로바이더 테스트 작성
이 자습서는 프로바이더 테스트를 처음부터 작성하는 방법을 안내합니다. 이는 소비자 테스트 자습서의 연속입니다. 먼저, 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
소비자 및 프로바이더의 이름을 지정하는 방법에 대한 자세한 내용은 명명 규칙을 참조하세요.
테스트 앱 구성
계약을 확인하려면 프로바이더 테스트를 테스트 요청을 실제로 하고 해당 계약과 대조할 응답을 반환하는 테스트 앱에 연결해야 합니다. 이를 위해 테스트가 사용하는 app
을 Environment::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
의 공급자 테스트는 이제 통과해야 합니다.