따라 하기: 새 테스트 추가하기
이 장에서는 rust#59333과 rust#161442를 예로 들어, Rust에 처음 기여할 때 해 볼 수 있는 작은 변경의 예를 보여 드립니다.
작업할 E-needs-test 이슈 찾기
시도해 볼 수 있는 작업 목록은 “무엇을 작업해야 합니까?”를 참고하십시오. 여기서는 E-needs-test 이슈인 rust#59333을 골랐습니다. 이 이슈에는 이슈 안에 바로 예제가 있어 버그를 최소화하는 추가 작업을 하지 않아도 되므로 특히 적합합니다. 물론 최소 예제가 없는 E-needs-test 이슈를 맡아 최소 예제를 만드는 것도 언제나 큰 도움이 됩니다.
이슈 재현하기
이 예제는 2019년, 즉 (이 글을 쓰는 시점 기준으로) 무려 7년 전에 게시되었습니다. 그동안 컴파일러에서는 상당히 많은 것이 바뀌었습니다. 테스트가 여전히 정확한지 확인하려면 가장 최신 컴파일러로 재현하십시오. nightly 브랜치로 설정한 play.rust-lang.org나 rustc nightly로 설정한 rust.godbolt.org를 사용하면 쉽게 재현할 수 있습니다. Playground에서는 할 수 없는 복잡한 설정이 필요하다면 로컬에서 rustc +nightly를 사용할 수도 있습니다.
이슈를 테스트로 변환하기
빠른 시작에 설명된 대로 rust-lang/rust 저장소를 체크아웃하고 설정하십시오.
$ git clone https://github.com/rust-lang/rust
$ cd rust
$ ./x setup compiler
$ ./x build library
여기서는 수정하려는 버그가 컴파일러와 관련되어 있으므로 기본 프로필로 compiler를 사용합니다. 표준 라이브러리에 단위 테스트를 추가하는 경우라면 ./x setup library를 사용합니다.
이 과정에서 .git/hooks/pre-push 검사 설정도 제안합니다. 이 설정은 선택 사항이지만 권장합니다.
또한 ./x build library로 백그라운드에서 빌드를 시작했습니다. 안타깝게도 Rust는 빌드하는 데 시간이 꽤 오래 걸리므로, 빌드를 일찍 시작해 두면 다른 작업을 하는 동안 백그라운드에서 빌드가 진행됩니다.
새 테스트를 추가하는 방법은 UI 테스트를 참고하십시오. 드물게는 run-make 테스트나 그보다 더 특수한 종류의 테스트가 필요할 수도 있습니다. 자세한 내용은 Compiletest를 참고하십시오.
이 경우 테스트는 상당히 간단합니다.
// Save this file to `tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs`.
//@ check-pass
//! Regression test for <https://github.com/rust-lang/rust/issues/59333>.
//! A type alias used only as (part of) the self type of an impl was
//! incorrectly flagged as dead code.
#![deny(dead_code)]
struct Runner;
type RuntimeImpl = Runner;
trait Runtime {
fn run(&mut self);
}
impl Runtime for &mut RuntimeImpl {
fn run(&mut self) {}
}
struct Walker;
type WalkerImpl = Walker;
trait Walk {
fn walk(&self) {}
}
impl Walk for WalkerImpl {}
fn main() {
let mut runner = Runner;
(&mut runner).run();
Walker.walk();
}
여기 나온 세부 사항은 대부분 그다지 중요하지 않지만, 맨 위의 //@ check-pass와 #![deny(dead_code)]에 주목하십시오. 이 둘을 함께 쓰면 이 파일을 컴파일할 때 컴파일러가 dead_code 린트를 내보내지 않는지 확인할 수 있습니다.
또한 “Regression test for …”(…에 대한 회귀 테스트)라는 주석에도 주목하십시오. 이 주석은 테스트가 무엇을 하는지, 그리고 그 동작을 더 간단하게 테스트할 방법이 있는지 리뷰어가 이해하는 데 도움이 되므로 리뷰어에게 매우 유용합니다. 테스트 설명은 최대한 빠짐없이 작성하십시오.
테스트를 실행하십시오. rust#161442는 테스트 이름을 tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs로 지었으므로 다음과 같이 실행하면 됩니다.
./x test tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs
테스트가 통과하면 준비가 끝난 것입니다.
PR 열기
PR 생명 주기의 지침을 따르십시오.
먼저, 앞에서 설정하지 않았다면 푸시 전 검사를 실행하십시오:
./x test tidy
그런 다음 PR을 여십시오:
git switch --create issue-59333-test
git add tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs
git commit
git remote add personal https://github.com/YOUR_USERNAME_HERE/rust.git
git push --set-upstream personal issue-59333-test
리뷰와 피드백
리뷰와 병합에 관한 정보는 PR 생명 주기를 참고하십시오.