테스트 / QA 프로세스와 통합 된 Git 분기 전략


131

우리의 개발팀은 GitFlow 브랜칭 전략을 사용하고 있습니다.

최근에 소프트웨어 품질을 향상시키기 위해 몇 명의 테스터를 모집했습니다. 아이디어는 모든 기능을 테스터가 테스트 / QA해야한다는 것입니다.

과거에는 개발자가 별도의 기능 분기에서 기능에 대해 작업하고 develop완료되면 다시 분기로 병합합니다 . 개발자는 해당 feature지점 에서 자신의 작업을 직접 테스트 합니다. 이제 테스터와 함께이 질문을 시작합니다

테스터는 어떤 지점에서 새로운 기능을 테스트해야합니까?

분명히 두 가지 옵션이 있습니다.

  • 개별 기능 지점에서
  • 상의 develop지점

개발 지점 테스트

처음에 우리는 이것이 다음과 같은 확실한 방법이라고 믿었습니다.

  • 이 기능은 develop개발이 시작된 이후 지점에 병합 된 다른 모든 기능으로 테스트 되었습니다.
  • 나중에 충돌을 감지 할 수 있습니다
  • 테스터의 업무를 쉽게 해주므로 항상 한 지점 ( develop) 만 처리 합니다. 그는 개발자에게 어떤 브랜치가 어떤 기능에 대한 것인지 묻지 않아도됩니다 (기능 브랜치는 관련 개발자가 독점적으로 자유롭게 관리하는 개인 브랜치입니다)

이것의 가장 큰 문제는 다음과 같습니다.

  • develop분기 버그로 오염되어있다.

    테스터는 버그 나 충돌을 발견하면 개발자에게 다시보고합니다. 개발자는 개발 브랜치에서 문제를 해결하고 (기능 브랜치는 병합 된 후에 포기 됨) 나중에 더 많은 수정이 필요할 수 있습니다. 여러 하위 시퀀스 커밋 또는 병합 ( develop버그 수정을 위해 브랜치를 다시 브랜치에서 다시 만든 develop경우) 가능한 경우 브랜치 에서 기능을 롤백 하는 것이 매우 어렵습니다. develop지점에 다른 시간 에 병합되고 수정되는 여러 기능이 있습니다 . develop브랜치의 일부 기능만으로 릴리스를 만들려고 할 때 큰 문제가 발생합니다.

기능 지점 테스트

다시 한 번 생각하고 기능 분기에서 기능을 테스트해야한다고 결정했습니다. 테스트하기 전에 develop브랜치에서 기능 브랜치로 변경 사항을 병합합니다 (브랜치 따라 잡기 develop). 이것은 좋다 :

  • 여전히 주류의 다른 기능으로 기능을 테스트합니다.
  • 추가 개발 (예 : 버그 수정, 충돌 해결)은 develop분기를 오염시키지 않습니다 .
  • 기능이 완전히 테스트되고 승인 될 때까지 기능을 릴리스하지 않도록 쉽게 결정할 수 있습니다.

그러나 몇 가지 단점이 있습니다

  • 테스터는 코드 병합을 수행해야하며, 충돌이있을 경우 (아마도) 개발자에게 도움을 요청해야합니다. 우리의 테스터는 테스트를 전문으로하며 코딩 할 수 없습니다.
  • 다른 새로운 기능이 없어도 기능을 테스트 할 수 있습니다. 예를 들어, 피처 A와 B는 동시에 테스트 중이며, 두 피처는 develop브랜치 에 병합되지 않았으므로 서로를 알지 못합니다 . 즉, develop두 기능이 모두 개발 브랜치에 병합되면 브랜치 에 대해 다시 테스트해야 합니다. 그리고 나중에 이것을 테스트해야한다는 것을 기억해야합니다.
  • 기능 A와 B가 모두 테스트되고 승인되었지만 충돌이 확인되면 두 기능의 개발자 모두 테스트를 통과 한 기능 분기 때문에 자신의 결함 / 작업이 아니라고 생각합니다. 의사 소통에 여분의 오버 헤드가 있으며 때로는 갈등을 해결하는 사람이 좌절됩니다.

위는 우리의 이야기입니다. 제한된 리소스로 모든 곳의 모든 것을 테스트하지 않기를 바랍니다. 우리는 여전히 이에 대처하는 더 좋은 방법을 찾고 있습니다. 다른 팀이 이런 상황을 어떻게 처리하는지 듣고 싶습니다.


5
이 문제 는 프로그래밍 문제가 아니라 개발 프로세스를 다루기 때문에 프로그래머 에게 더 적합한 것처럼 보입니다 . 누군가 마이그레이션 할 수 있습니까?


2
우리의 모델은 정확히 동일합니다. QA 팀이 기능 분기에 대한 문제를 현장의 문제 또는 UAT 프로세스 (문제가있는 경우)와 다르게보고하는 방법에 관심이 있습니다. 우리는 Atlassian JIRA를 사용하며이 둘을위한 다른 워크 플로우를 가지고 있습니다.
void.pointer

2
지금 같은 것을 결정합니다. 또한 우리 환경은 Java 스프링 애플리케이션이므로 테스트 환경에 빌드하고 배포하는 데 약 20 분이 걸립니다. 행복한 사람은 내가 가진 것과 같은 의심을 물었습니다.
digao_mb

첫 번째 단점은 기능 분기에서 테스트하는 과정에 내재 된 것이 아닙니다. Github Enterprise 및 Bitbucket과 같은 툴은 풀 요청에 대한 승인을 요구할 수 있으며 QA 담당자는 개발자에게 자유롭게 통합 할 수 있다는 신호를 개발자에게 승인 할 수 있습니다.
Derek Greer

답변:


102

우리가하는 방식은 다음과 같습니다.

최신 개발 분기 코드를 병합 한 후 기능 분기를 테스트합니다. 주요 이유는 기능이 승인되기 전에 개발 브랜치 코드를 "공해"하지 않기 때문입니다. 테스트 후 기능이 승인되지 않지만 개발시 이미 병합 된 다른 기능을 출시하려고하는 경우가 있습니다. 개발은 릴리스가 시작되는 지점이므로 릴리스 가능한 상태가 더 좋습니다. 긴 버전은 여러 단계에서 테스트하는 것입니다. 보다 분석적으로 :

  1. 개발자는 모든 새로운 기능에 대한 기능 분기를 만듭니다.
  2. 기능 브랜치는 개발자가 테스트 할 모든 커밋과 함께 TEST 환경에 (자동으로) 배포됩니다.
  3. 개발자가 배포를 마치고 기능을 테스트 할 준비가되면 기능 분기의 개발 분기를 병합하고 TEST의 모든 최신 개발 변경 사항이 포함 된 기능 분기를 배치합니다.
  4. 테스터는 TEST에서 테스트합니다. 작업이 완료되면 스토리를 "수락"하고 기능 분기를 개발시 병합합니다. 개발자가 이전에 개발 브랜치 기능을 병합 했으므로 일반적으로 너무 많은 충돌이 예상되지 않습니다. 그러나이 경우 개발자가 도움을 줄 수 있습니다. 이것은 까다로운 단계입니다. 피하는 가장 좋은 방법은 기능을 가능한 한 작게 / 특정하게 유지하는 것입니다. 다른 기능들은 결국 어떤 방식 으로든 병합되어야합니다. 물론 팀의 규모는이 단계의 복잡성에 중요한 역할을합니다.
  5. 또한 개발 지점은 TEST에 (자동으로) 배포됩니다. 브랜치 빌드 기능이 실패 할 수 있지만 브랜치 개발이 실패하지 않아야한다는 정책이 있습니다.
  6. 기능 정지에 도달하면 개발에서 릴리스를 작성합니다. 이것은 STAGING에 자동으로 배포됩니다. 프로덕션 배포 전에 광범위한 엔드 투 엔드 테스트가 수행됩니다. (어쩌면 나는 그것들이 매우 광범위하지는 않지만 조금 과장해도 될 것이라고 생각합니다). 이상적으로 베타 테스터 / 동료는 실제 사용자가 테스트해야합니다.

이 접근법에 대해 어떻게 생각하십니까?


2
독립적으로 테스트 된 feature1과 feature2가 함께하기에 좋은지 어떻게 확인합니까 (질문에서 언급했듯이)?
Kumar Deepak

2
우리는 간접적으로 하나를 합친 다음 다른 하나를 개발하여 개발합니다. 위 프로세스의 4 단계이며 시간 순서와 관련이 있습니다. 따라서 기능 2를 병합 할 준비가되었지만 기능 1이 이미 병합 된 경우 기능 2 개발자와 테스터는 병합이 작동하는지 확인해야합니다.
Aspasia

1
어쨌든 자식 분기 모델 에 따르면 두 기능 분기를 서로 병합하지 않아야한다고 생각합니다.
아스파 시아

1
우리는 6 단계에서 문제를 겪었습니다. 특히 가능한 한 늦게 기능으로 병합 된 데에도 불구하고 QA가 기능 브랜치에서 사인 오프 한 후에 발생하는 사소한 병합으로 인해 여러 기능이 개발되어 크런치 타임에 발생했습니다. 나는 여기에 조금 더 자세하게 언급했다 : stackoverflow.com/a/25247382/411282
Joshua Goldberg

8
각 기능 분기에 대해 완전한 테스트 환경 (DB, 서버, 클라이언트 등)이 있습니까? 또는 환경을 공유하고 다른 이름을 가지고 있습니까 (예 : app-name_feature1- app-name_feature2 등)
hinneLinks

41

테스트하기 전에 개발 브랜치에서 기능 브랜치로 변경 사항을 병합합니다.

아니요. 특히 '우리'가 QA 테스터 인 경우에는 안됩니다. 병합에는 잠재적 충돌을 해결하는 것이 포함되며, QA 테스터 (가능한 한 빨리 테스트를 진행해야 함)가 아닌 개발자 (코드를 알고 있음)가 수행하는 것이 가장 좋습니다.

개발자가 할 수 있도록 그 / 그녀의 REBASE feature의 상단에 지점을devel , 그리고 그 밀어 feature분기 (컴파일하고 가장 최근의 상단에 작업과 개발자에 의해 검증 된 devel지점의 상태).
그것은 가능합니다 :

테스터가 버그를 발견 할 때마다 개발자에게 버그를보고 하고 현재 기능 분기를 삭제 합니다.
개발자는 다음을 수행 할 수 있습니다.

  • 버그 수정
  • 최근에 가져온 개발 브랜치에서 rebase (다시, 코드가 다른 검증 된 기능과 통합되어 작동하는지 확인)
  • feature지점을 밀어 넣습니다 .

일반적인 아이디어 : 개발자가 병합 / 통합 파트를 수행하고 테스트를 QA에 맡기십시오.


"병합을 사용하지 말고 대신 rebase를 사용하십시오"라고 말하고 있습니까? 그렇다면 git.wiki.kernel.org/index.php/…
Vicki Laidler

1
@VickiLaidler 예, QA가 기능 분기를 거부하면 개발자는 병합하지 않고 리베이스해야합니다 ( stackoverflow.com/a/804178/6309 )
VonC

1
@VonC 나는 완전히 동의하지만 몇 가지 문제가 있습니다 : 1) 분기를 삭제하면 Stash Pull Requests (분기를 삭제하면 PR이 닫힙니다)와 같은 다른 툴링에 영향을 미칩니다. 힘 밀기를 선호하십시오. 2) 평생 동안 두 사람이 공동 작업을 수행 한 대규모 지점 인 경우 리베이스 작업보다 병합이 선호되었을 것입니다. 마지막에 그것을 rebas하면 병합 커밋이 제거 될 때 충돌 악몽을 일으키고 코드가 그러한 병합 변경에 의존하는 경우 수정하는 것이 쉽지 않습니다
void.pointer

1
내 대답을 되돌아 보면 리베이스를 수행하고 더 깨끗한 기록을 위해 병합하지 않습니다.
Aspasia

1
@Aspasia 좋은 지적. 더 많은 가시성을 얻기 위해 풀 요청을 답변에 포함 시켰습니다.
VonC

12

가장 좋은 방법은 지속적인 통합입니다 . 일반적인 아이디어는 가능한 한 자주 기능 분기를 개발자 분기로 병합하는 것입니다. 이것은 통증 병합의 오버 헤드를 줄입니다.

가능한 한 자동화 된 테스트에 의존하고 Jenkins의 단위 테스트를 통해 빌드가 자동으로 시작됩니다. 개발자가 변경 사항을 메인 브랜치에 병합하여 모든 작업을 수행하고 모든 코드에 대한 단위 테스트를 제공하십시오.

테스터 / QA는 기능이 완료되면 코드 검토에 참여하고 단위 테스트를 확인하고 회귀 스위트에 추가 할 자동화 된 통합 테스트를 작성할 수 있습니다.

자세한 내용은이 링크를 확인 하십시오 .


Git에서 분기 + 리베이스를 사용하여 CI를 계속 수행 할 수 있습니다.
void.pointer

9

우리는 "금", "은"및 "청동"을 사용합니다. 이것은 prod, staging 및 qa라고 할 수 있습니다.

이것을 이것을 용광로 모델이라고 부릅니다. 요구 사항을 이해하기 어려울 수 있기 때문에 비즈니스 측면에서 QA가 엄청나게 필요하기 때문에 잘 작동합니다.

버그 나 기능을 테스트 할 준비가되면 "청동"상태가됩니다. 이는 코드를 사전 빌드 된 환경으로 푸시하는 jenkins 빌드를 트리거합니다. 우리의 테스터들 (수퍼 테크놀러지가 아닌)은 링크를 누르고 소스 컨트롤에 신경 쓰지 않습니다. 이 빌드는 테스트 등도 실행합니다. 테스트 (단위, 통합, 셀레늄)가 실패하는 경우 실제로이 빌드에서 코드를 testing \ qa 환경으로 푸시했습니다. 별도의 시스템에서 테스트하는 경우 (우리는 lead라고 함) 변경 사항이 QA 환경으로 푸시되지 않도록 할 수 있습니다.

초기 두려움은 우리가이 기능들 사이에 많은 갈등이있을 것이라는 점이었습니다. 기능 X가 기능 Y가 중단되는 것처럼 보이지만, 자주 발생하지 않으며 실제로 도움이됩니다. 변화의 맥락에서 보이는 것 이외의 광범위한 테스트를 얻는 데 도움이됩니다. 운 좋게도 당신의 변화가 어떻게 병렬 개발에 영향을 미치는지 알게 될 것입니다.

기능이 품질 보증을 통과하면 '실버'또는 준비로 이동합니다. 빌드가 실행되고 테스트가 다시 실행됩니다. 매주 우리는 이러한 변경 사항을 "골드"또는 제품 트리로 푸시 한 다음 프로덕션 시스템에 배포합니다.

개발자는 골드 트리에서 변경을 시작합니다. 기술적으로는 준비가 시작될 수 있으므로 준비를 시작할 수 있습니다.

비상 픽스는 골드 트리에 직접 급강하합니다. 변경이 간단하고 QA하기 어려운 경우 테스트 트리로가는 길을 찾을 수있는은으로 직접 갈 수 있습니다.

출시 후 우리는 모든 것을 동기화하기 위해 금 (prod)의 변화를 브론즈 (testing)로 푸시합니다.

준비 폴더로 이동하기 전에 리베이스를 수행 할 수 있습니다. 우리는 때때로 테스트 트리를 제거하면 깨끗하게 유지된다는 것을 발견했습니다. 특히 개발자가 떠날 경우 테스트 트리에서 기능이 폐기되는 경우가 있습니다.

대규모 다중 개발자 기능의 경우 별도의 공유 저장소를 만들지 만 모두 준비가되면 테스트 트리에 병합합니다. QA에서 반송되는 경향이 있으므로 변경 세트를 격리 된 상태로 유지하여 준비 트리에 추가 한 다음 병합 / 스쿼시 할 수 있어야합니다.

"베이킹"도 좋은 부작용입니다. 근본적인 변화가 있다면 잠시 동안 자리를 잡고 싶은 것이 좋습니다.

또한 이전 릴리스는 유지 관리하지 않습니다. 현재 버전은 항상 유일한 버전입니다. 그럼에도 불구하고 테스터 나 커뮤니티가 다양한 기여자가 물건을 어떻게 상호 작용하는지 볼 수있는 마스터 베이킹 트리를 가질 수 있습니다.


1

수동 테스트에만 의존하지는 않습니다. Jenkins를 사용하여 각 기능 분기의 테스트를 자동화합니다. 모든 브라우저에 대해 Linux 및 Windows에서 Jenkins 테스트를 실행하도록 VMWare 랩을 설정했습니다. 진정으로 훌륭한 크로스 브라우저, 크로스 플랫폼 테스트 솔루션입니다. Selenium Webdriver와의 기능 / 통합을 테스트합니다. 내 셀레늄 테스트는 Rspec에서 실행됩니다. 그리고 Windows에서 jRuby 가로 드하도록 특별히 작성했습니다. Rspec에서 전통적인 단위 테스트를 수행하고 Jasmine에서 Javascript 테스트를 실행합니다. Phantom JS로 헤드리스 테스트를 설정했습니다.


1

우리 회사에서는 민첩한 개발을 사용할 수 없으며 비즈니스에 따른 모든 변경에 대한 승인이 필요합니다. 이로 인해 많은 문제가 발생합니다.

GIT 작업에 대한 우리의 접근 방식은 다음과 같습니다.

우리는 회사에서 "Git Flow"를 구현했습니다. 우리는 JIRA를 사용하며 승인 된 JIRA 티켓 만 프로덕션으로 이동해야합니다. 테스트 승인을 위해 별도의 테스트 브랜치를 생성했습니다.

JIRA 티켓을 처리하는 단계는 다음과 같습니다.

  1. Develop-Branch에서 새 지점 생성
  2. 기능 지점에서 코드 변경 수행
  3. 테스트 / QA 지점에 대한 변경 사항을 피처에서 가져옵니다.
  4. 비즈니스 승인 후 기능 지점에서 개발로 변경 사항을 가져옵니다.
  5. 개발은 릴리스에서 자주 진행된 다음 최종적으로 마스터 브랜치

각 요청을 고유 한 기능으로 분할하면 승인 된 변경 사항 만 프로덕션에 적용됩니다.

전체 프로세스는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.