feature_flag
RSpec 태그- 셀렉터 사용하기
- 리소스 클래스 사용하기
- 캐싱으로 인한 불안정성 관리
- 기능 플래그가 활성화된 상황에서 시나리오 실행
- 기능 플래그가 활성화된 상태에서 end-to-end 테스트가 통과되는지 확인
특징 플래그로 테스트하기
특징 플래그를 활성화하여 특정 테스트를 실행하려면 QA::Runtime::Feature
클래스를 사용하여 특징 플래그를 활성화 및 비활성화할 수 있습니다 (API를 통해).
특징 플래그를 변경하려면 관리자 권한이 필요합니다. QA::Runtime::Feature
는 적절한 액세스 토큰을 제공하면 (권장됨) GITLAB_QA_ADMIN_ACCESS_TOKEN
을 통해 관리자로 자동 인증되거나 GITLAB_ADMIN_USERNAME
및 GITLAB_ADMIN_PASSWORD
를 제공하면 관리자로 자동 인증됩니다.
feature_flag
RSpec 태그
테스트가 적절한 환경에서 건너뛸 수 있도록 feature_flag
태그를 포함해야 합니다.
필수 메타데이터:
name
- 형식:
feature_flag: { name: 'feature_flag_name' }
- 정보 제공을 위해 사용됩니다. 테스트하는 특징 플래그를 결정하기 위해 포함되어야 합니다.
선택적 메타데이터:
scope
- 형식:
feature_flag: { name: 'feature_flag_name', scope: :project }
-
scope
가:global
로 설정된 경우 테스트는 모든 라이브 .com 환경에서 건너뛰어집니다. 이는 특징 플래그 변경이 다른 테스트나 해당 환경의 사용자에게 영향을 미치는 문제를 피하기 위한 것입니다. - 다른 값 (예:
:project
,:group
또는:user
)으로scope
가 설정된 경우 또는scope
가 지정되지 않은 경우 테스트는 canary, production, 및 pre-production에서만 건너뜁니다.
경고: 먼저 그룹, 프로젝트, 사용자를 위해 특징 플래그를 활성화하려고 시도하는 것이 좋습니다.
- 전역 특징 플래그를 사용해야 하는 경우 feature_flag
메타데이터에 scope: :global
을 적용하는 것이 좋습니다. 하지만, 이는 SET의 재량에 따라 위험 수준을 결정합니다.
- 예를 들어, 어떤 테스트가 응용 프로그램의 작은 영역에만 영향을 주는 전역 특징 플래그를 사용하며 라이브 환경에서 중요한 문제를 확인해야 하는 경우가 있습니다. 이러한 시나리오에서는 테스트 실행을 건너뛰는 것이 더 위험할 수 있습니다. 이런 경우 메타데이터에서 scope
를 생략하여 라이브 환경에서도 테스트를 실행할 수 있도록 남겨둘 수 있습니다.
requires_admin
에 대한 참고: 이 태그는 특징 플래그를 업데이트하는 것과 관계없는 테스트 내의 다른 동작에도 관리자 액세스가 필요한 경우에도 여전히 적용되어야 합니다 (예: API를 통해 사용자를 생성하는 등).
아래 코드는 테스트에서 생성된 프로젝트에 :feature_flag_name
라는 이름의 특징 플래그를 활성화합니다:
RSpec.describe "특징 플래그 활성화", feature_flag: {
name: 'feature_flag_name',
scope: :project
} do
let(:project) { Resource::Project.fabricate_via_api! }
around do |example|
Runtime::Feature.enable(:feature_flag_name, project: project)
example.run
Runtime::Feature.disable(:feature_flag_name, project: project)
end
it "특징 플래그 테스트" do
# 특징 플래그를 활성화하여 테스트를 실행합니다.
# 이는 이 테스트에서 생성된 프로젝트에만 영향을 줍니다.
end
end
enable
및 disable
메서드는 먼저 플래그를 설정한 후 API에서 업데이트된 값을 확인합니다.
마찬가지로, 그룹, 사용자 또는 특징 그룹에 대한 특징을 활성화할 수 있습니다:
group = Resource::Group.fabricate_via_api!
Runtime::Feature.enable(:feature_flag_name, group: group)
user = Resource::User.fabricate_via_api!
Runtime::Feature.enable(:feature_flag_name, user: user)
feature_group = "a_feature_group"
Runtime::Feature.enable(:feature_flag_name, feature_group: feature_group)
scope
가 제공되지 않으면 특징 플래그가 인스턴스 전체에 설정됩니다:
# 이는 모든 사용자에게 영향을 줍니다!
Runtime::Feature.enable(:feature_flag_name)
셀렉터 사용하기
새로운 기능은 대부분의 경우 vue
컴포넌트 또는 haml
파일을 새 파일로 대체합니다.
대부분의 경우, 새 파일 또는 컴포넌트는 특징 플래그로만 접근할 수 있습니다.
이 방법은 테스트가 특징 플래그를 사용하고 사용하지 않는 두 가지 경우 모두 통과해야 할 때 문제가 됩니다. 테스트가 두 경우 모두 통과하려면:
- 새 컴포넌트 또는 파일 내에 다른 셀렉터를 만듭니다.
- 이전 것과 동일한 이름을 지정합니다.
셀렉터는 페이지 오브젝트의 특정 프론트엔드 파일에 연결되어 있으며 qa:selectors
테스트 내에서 사용 가능한지 확인됩니다. 언급된 셀렉터가 해당 프론트엔드 파일에 누락되어 있는 경우 테스트가 실패합니다. 특징 플래그가 활성화되거나 비활성화될 때 셀렉터를 사용할 수 있도록 하려면 새 셀렉터를 페이지 오브젝트에 추가하고 이전 셀렉터는 그대로 둡니다. 이렇게 하면 테스트가 올바른 셀렉터를 사용하고 누락된 셀렉터를 감지합니다.
기존 프론트엔드 파일을 변경하여 새로운 기능이 이미 있는 셀렉터를 변경해야 하는 경우, 동일한 이름의 새 셀렉터를 추가할 수 있습니다. 그러나 페이지에는 표시되는 셀렉터 중 하나만 있어야 합니다. 따라서 다음을 수행해야 합니다:
- 특징 플래그로 다른 셀렉터를 비활성화합니다.
- 특징 플래그에서 해당 셀렉터를 제거할 때 이전 셀렉터를 프론트엔드 파일과 페이지 오브젝트 파일에서 삭제하기 위해 주석을 추가합니다.
예시 (변경 전)
# 이것은 이전 파일에 대한 링크입니다
view 'app/views/devise/passwords/edit.html.haml' do
# 새 셀렉터는 동일한 이름을 가져야 합니다.
element 'password-field'
...
end
예시 (변경 후)
view 'app/views/devise/passwords/edit.html.haml' do
element 'password-field'
...
end
# 이제 셀렉터의 사용 가능 여부를 확인할 수 있습니다
view 'app/views/devise/passwords/new_edit_behind_ff.html.haml' do
# 셀렉터는 동일한 이름을 가집니다
element 'password-field'
end
리소스 클래스 사용하기
리소스 클래스가 특징 플래그가 활성화되어 있는 경우 다르게 동작해야 한다면 클래스 내부에 특징 플래그의 이름을 가진 변수를 토글하세요. 이 변수와 조건은 모든 동작이 적절하게 처리되도록 합니다.
이 변수를 fabricate_via_api
호출 내부에서 설정할 수 있습니다. 일관된 방식을 위해 다음을 사용합니다:
- 비활성화된 것이 아니라 활성화가 되었는지 검사합니다.
- 변수 이름 뒤에
activated
라는 단어를 추가합니다. -
initialize
메서드 내부에서 변수의 기본값을 설정합니다.
예를 들어:
def initialize
name_of_the_feature_flag_activated = false
...
end
정리
기능 플래그를 제거한 후에 리소스 클래스를 정리하고 변수를 삭제하십시오. 모든 메소드는 이제 기본 상태의 조건 절차를 사용해야 합니다.
캐싱으로 인한 불안정성 관리
모든 응용 프로그램 설정 및 모든 기능 플래그는 GitLab 내에서 1분 동안 캐시됩니다. 테스트 중에는 모든 캐싱이 비활성화되지만 정적 환경에서는 예외입니다.
테스트가 기능 플래그를 변경하면 요소가 활성 기능 플래그로만 표시되는 경우 불안정한 동작을 일으킬 수 있습니다. 이러한 동작을 우회하려면 기능 플래그 뒤에 있는 요소를 기다리는 것을 추가하십시오.
기능 플래그가 활성화된 상황에서 시나리오 실행
기존 테스트를 편집할 필요 없이 기능 플래그가 활성화된 상태에서 전체 시나리오를 실행하는 것도 가능합니다.
세부 내용은 QA README를 참조하십시오.
기능 플래그가 활성화된 상태에서 end-to-end 테스트가 통과되는지 확인
Staging 또는 GitLab.com에서 활성화되기 전에 end-to-end 테스트는 기능 플래그가 활성화된 상태로 통과해야 합니다. 업데이트해야 할 테스트는 quad-planning의 일부로 식별되어야 합니다. 관련된 소프트웨어 엔지니어 테스트 담당자는 테스트를 업데이트하거나 다른 엔지니어를 지원하는 데 책임이 있습니다. 그러나 변경사항이 quad-planning을 거치지 않고 필요한 테스트 업데이트가 이뤄지지 않으면 테스트 실패로 배포가 차단될 수 있습니다.
기능 플래그 정의가 변경될 때 자동 테스트 실행
end-to-end 테스트가 통과되는 두 가지 방법이 있습니다.
- 만약 병합 요청이 기능 플래그 정의 파일을 추가하거나 편집한다면, 두 개의
e2e:test-on-omnibus
작업 (ee:instance-parallel
및ee:instance-parallel-ff-inverse
)이 병합 요청 파이프라인에 자동으로 포함됩니다. 하나의 작업은 기본 기능 플래그 상태로 응용 프로그램을 실행하고 다른 하나는 그 상태의 역을 설정합니다. 이러한 작업은 기능 플래그가 활성화되었을 때 또는 비활성화되었을 때 동일한 테스트 모음을 실행하여 해당 테스트가 통과하는지 확인합니다. - 경우에 따라서 end-to-end 테스트 작업이 자동으로 트리거되지 않았거나, 기본 기능 플래그 값(원하는 결과가 아닐 수 있음)으로 테스트를 실행했다면 기능 플래그를 활성화하는 Draft MR을 만들어 모든 E2E 테스트가 기능 플래그를 활성화하고 비활성화할 때 모두 통과하는지 확인할 수 있습니다.
기능 플래그가 활성화된 상태로 end-to-end 테스트 실패 해결
기능 플래그를 활성화하면 E2E 테스트가 실패할 경우, 실패한 파이프라인의 아티팩트를 검색하여 실패한 테스트의 스크린샷을 볼 수 있습니다. 그 후에 다음 중 하나를 할 수 있습니다.
- 업데이트해야 할 테스트를 식별하고 그 작업에 대한 업데이트에 책임이 있는 관련 소프트웨어 엔지니어 테스트 담당자에게 연락하십시오. 그러나 변경사항이 quad-planning을 거치지 않고 필요한 테스트 업데이트가 이뤄지지 않으면 테스트 실패로 배포가 차단될 수 있습니다.
- 사전에 설정에 상당한 양의 시간이 필요하지만, 실패한 테스트를 실행하여(https://gitlab.com/gitlab-org/gitlab/-/tree/master/qa#run-the-end-to-end-tests-in-a-local-development-environment)와 함께 기능 플래그를 활성화한 상태에서 로컬에서 실행할 수 있습니다. 이렇게 하면 브라우저가 실패한 테스트를 실행하는 동안의 상황을 더 빠르게 디버깅하는 데 도움이 되는 문제를 확인할 수 있습니다. 또한 E2E 테스트에 대한 문제 해결 가이드를 참조하여 일반적인 차단 요소에 대한 지원을 받을 수 있습니다.
기능 개발 중인 테스트 실행
end-to-end 테스트가 기능 플래그를 활성화하면 병합 요청 파이프라인에서 e2e:test-on-omnibus
작업을 실행하여 병합 요청에서 변경 내용을 테스트할 수 있습니다.
기능 플래그와 관련 변경 사항이 이미 병합된 경우, 기본 브랜치에서 테스트가 통과하는지 확인할 수 있습니다. end-to-end 테스트는 기본 브랜치에서 매 2시간마다 실행되며 결과는 테스트 세션 보고서에 게시됩니다.
만약 관련 테스트가 스스로 기능 플래그를 활성화하지 않는다면, 기능 플래그 정의 파일을 통해 기본적으로 기능 플래그를 활성화하는 Draft MR을 여는 것으로 해당 테스트가 업데이트가 필요한지 확인할 수 있습니다. 이렇게 하면 end-to-end 테스트 모음이 자동으로 실행됩니다. 테스트가 통과하면 병합 요청을 닫을 수 있습니다. 테스트를 업데이트하는 데 도움이 필요한 경우 관련 Quality 부서에서 안정적인 대응 상대 또는 귀하의 그룹에 안정적인 대응 상대가 없는 경우 다른 소프트웨어 엔지니어 테스트에게 연락하십시오.