통합 코드 기후 및 go PKG

15059 단어 codequalitygotesting
TL;DR: Golang 코드 커버율과 코드 환경을 통합할 때 --prefix 단계에서 after-build arg (pkg github 접두사, 즉 "github.com/mottaquikarim/esqueridsl") 를 설정하여 테스트 보고원이 src 코드를 식별할 수 있도록 합니다.
만약 ^^ 의미가 없다면 아래의 전체 배경을 읽어 주십시오👍
나는 최근에 esquerydsl라는 골뱅 pkg을 발표했는데, 이것은 골뱅이에서elasticsearch 조회를 안전하게 구축하는 데 도움이 된다.
미래의 안정성을 확보하기 위해 저는 통합Code Climate을 통해 유지보수성과 테스트 범위율을 추적하고 싶습니다.
이전에python 프로젝트에서CC를 사용한 적이 있지만 go에서 사용한 적이 없습니다. 통합할 때 기록/공유해야 한다고 생각하는 문제에 부딪혔습니다.

0단계: 테스트를 작성하고 실행합니다!
나는 실제 소스 코드를 상세하게 설명하지 않고 테스트 + 결과를 어떻게 실행하고 코드 환경으로 내보내는지에 중점을 두었다.
go에서 테스트를 실행하는 것은 매우 간단합니다.
go test ./...
나는 docker에서 일하는 것을 더 좋아하기 때문에 보통 다음과 같은 방식으로 상술한 조작을 실행한다.
docker run -w /app -v ${PWD}:/app golang:1.15 go test ./...
(여기 있는 모든 예는 docker에서 실행됩니다.)
계속하기 전에 우리는 먼저 그것을 분해한다.
  • docker run:docker 용기에서 물건을 운행합시다
  • -w /app: 작업 디렉토리는 app 폴더
  • 가 될 것입니다.
  • -v ${PWD}:/app: 현재 작업 디렉토리 볼륨을 컨테이너의 작업 디렉토리에 넣습니다.이것은 개발 기간
  • 에 작성 중인 원본 코드에 대한 빠른 실행 테스트를 할 수 있는 좋은 기술이다.
  • golang:1.15: 우리가 실행하고 싶은 그림은 이 예에서golangv1입니다.15
  • go test ./...: 마지막으로 docker 용기에서 실행하기를 원하는 명령입니다. 이것은 당연히 Gotest 명령입니다

  • 추적 코드 덮어쓰기
    Golang의 코드 커버율을 추적하는 것도 매우 쉽다.우리는 go test 명령에 arg를 추가하기만 하면 된다.
    -coverprofile=c.out
    
    -coverprofile 파라미터는 go가 테스트 덮어쓰기 결과를 어디서 발표하는지 알려주고 잠시 후에 이를 분석하여 시각화된 소스 코드의 덮어쓰기 결과를 도울 수 있다.
    결론:
    docker run -w /app -v ${PWD}:/app golang:1.15 go test ./... -coverprofile=c.out
    
    현재 작업 디렉터리에 c.out 라는 파일이 있습니다. 이것은 줄마다 테스트 덮어쓰기 데이터를 인코딩합니다.위대하다우리가 지금 해야 할 일은 이것을 기후 코드에 올리는 것이다. 우리는 금색이다.

    사이드바:HTML 형식으로 코드 덮어쓰기 결과 생성
    올바른 탄젠트이므로 무시하십시오.
    나는 내가 단원 테스트에서 어떤 줄을 빠뜨렸는지 이해하고 확인하는 것이 매우 유용하다는 것을 발견했다.한 줄 한 줄 테스트 범위가 반드시 안정성을 보장하는 것은 아니지만, 나는 그것이 유용한 기준이라는 것을 발견했다. 단원 테스트를 언제 중단하는지 알 수 있도록 도와줄 수 있다. (나의 테스트 범위는 약 90+)👍 (점)
    go에서 시각화를 실현하려면 테스트 후 다음 명령을 실행합니다.
    docker run -w /app -v ${PWD}:/app golang:1.15 go tool cover -html=c.out -o coverage.html
    
    coverage.html 브라우저에서 src 코드를 열면 테스트에 덮어쓰고 누락된 줄을 직관적으로 표시할 수 있습니다.

    CodeClimate 시작
    나는 이 문장을 건너갈 것이다. 그렇지 않으면 이 문장은 매우 길 것이다.내 가설은 이 글을 읽은 사람이 이미 CC 품질 계정을 하나 가지고 있고 (golang!)재구매가 사용으로 설정되었습니다.

    1단계:test reporter 다운로드
    Climate test reporter 코드를 다운로드하고 실행합니다.물론, 우리는 docker 용기에서 이 점을 실현하기를 희망한다.내게는 다음과 같은 의미가 있습니다.
    # 1. download CC test reported
    CC_URL=https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64
    docker run -w /app -v ${PWD}:/app golang:1.15 \
        /bin/bash -c \
        "curl -L ${CC_URL} > ./cc-test-reporter"
    
    # 2. update perms
    docker run -w /app -v ${PWD}:/app golang:1.15 chmod +x ./cc-test-reporter
    
    # 3. run before build
    docker run -w /app -v ${PWD}:/app \
        -e CC_TEST_REPORTER_ID=${CC_TEST_REPORTER_ID} \
        golang:1.15 ./cc-test-reporter before-build
    
    여기에는 세 가지 주요 부분이 있다.
  • 테스트 리포트를 다운로드해야 합니다curl를 통해CC_URL다운로드할 수 있습니다.나는 docker run 명령에서 두 단계로 그것을 실행했다. 이것이 바로 내가 /bin/bash -c "...steps to run..." 줄을 가지고 있는 이유이다. (필요하면 두 줄로 나누어 실행할 수도 있다.)
  • perms를 업데이트하여 다운로드를 실행할 수 있도록 합니다.용기 자체의 이름 바꾸기 파일 chmod 에서 cc-test-reporter 을 실행합니다. (마음대로 호출할 수 있습니다.)
  • 마지막으로 before-build를 실행하고testreporter를 설정하여 덮어쓰기 데이터를 보냅니다.CC_TEST_REPORTER_ID는 중요한 것이다. 이것이 바로 CC가 환매 협의의 코드 커버율이 정말로 당신에게 왔는지 검증하는 것이다.나는 그것을 envvar로 삼았다. 왜냐하면 그것은 어느 곳의 코드에 제출되어서는 안 되기 때문이다.

  • 2단계: 코드 덮어쓰기를 사용하여 테스트 실행
    이 단계는 매우 간단하다. 기본적으로 0단계이다.
    docker run -w /app -v ${PWD}:/app golang:1.15 go test ./... -coverprofile=c.out
    

    3단계: 사후 구축
    이것이 바로 내가 문제에 부딪힌 곳이다.간단/로깅 단계는 다음과 같습니다.
    # upload data to CC
    docker run -w /app -v ${PWD}:/app \
        -e CC_TEST_REPORTER_ID=${CC_TEST_REPORTER_ID} \
        golang:1.15 ./cc-test-reporter after-build
    
    이 점에서 이것은 상당히 표준적이다.CodeClimate의 지도에 따라 우리는 cc-test-reporterarg 운행after-build을 사용한다.그리고 우리는 CC_TEST_REPORTER_ID를 통해 우리의 신분을 확정한다.그러나 축구하는 사람은 유일하다. 위의 명령은 소용없다!
    esquerydsl 패키지를 위해 위의 줄을 실행할 때 (평시하고 나도 임시로 --debug 로고를 추가했다) 나는 다음과 같은 출력을 얻었다.
    time="2020-12-31T19:52:57Z" level=error msg="failed to read file github.com/mottaquikarim/esquerydsl/esquerydsl.go\nopen github.com/mottaquikarim/esquerydsl/esquerydsl.go: no such file or directory"
    Error: open github.com/mottaquikarim/esquerydsl/esquerydsl.go: no such file or directory
    
    다음과 같이 복구하려면 --prefix가 필요합니다.
    docker run -w /app -v ${PWD}:/app \
        -e CC_TEST_REPORTER_ID=${CC_TEST_REPORTER_ID} \
        golang:1.15 ./cc-test-reporter after-build --prefix=github.com/mottaquikarim/esquerydsl
    
    주의하십시오--prefix=github.com/mottaquikarim/esquerydsl.완전한 패키지 접두사 URL이 있어야만 작업을 할 수 있습니다.일단 내가 이 파라미터를 추가하면, 나는 나의 Pkg 코드 커버율 통계 데이터를 업로드할 수 있다.(보기here.

    비밀 번호
    나는 이 물건을 가지런한 리본에 묶어서 여러분과 나누고 싶습니다.Github 작업에서 이 작업을 실행하는 데 make targets를 사용합니다.나는 미래의 다른 사람들을 도울 수 있도록 아래의 식단을 공유할 것이다.
    Makefile
    # Definitions
    ROOT                    := $(PWD)
    GO_HTML_COV             := ./coverage.html
    GO_TEST_OUTFILE         := ./c.out
    GOLANG_DOCKER_IMAGE     := golang:1.15
    GOLANG_DOCKER_CONTAINER := goesquerydsl-container
    CC_TEST_REPORTER_ID := ${CC_TEST_REPORTER_ID}
    CC_PREFIX       := github.com/mottaquikarim/esquerydsl
    
    #   Usage:
    #       make test
    test:
        docker run -w /app -v ${ROOT}:/app ${GOLANG_DOCKER_IMAGE} go test ./... -coverprofile=${GO_TEST_OUTFILE}
        docker run -w /app -v ${ROOT}:/app ${GOLANG_DOCKER_IMAGE} go tool cover -html=${GO_TEST_OUTFILE} -o ${GO_HTML_COV}
    
    # custom logic for code climate, gross but necessary
    _before-cc:
        # download CC test reported
        docker run -w /app -v ${ROOT}:/app ${GOLANG_DOCKER_IMAGE} \
            /bin/bash -c \
            "curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter"
    
        # update perms
     docker run -w /app -v ${ROOT}:/app ${GOLANG_DOCKER_IMAGE} chmod +x ./cc-test-reporter
    
        # run before build
     docker run -w /app -v ${ROOT}:/app \
            -e CC_TEST_REPORTER_ID=${CC_TEST_REPORTER_ID} \
           ${GOLANG_DOCKER_IMAGE} ./cc-test-reporter before-build
    
    _after-cc:
        # handle custom prefix
        $(eval PREFIX=${CC_PREFIX})
    ifdef prefix
        $(eval PREFIX=${prefix})
    endif
        # upload data to CC
        docker run -w /app -v ${ROOT}:/app \
            -e CC_TEST_REPORTER_ID=${CC_TEST_REPORTER_ID} \
            ${GOLANG_DOCKER_IMAGE} ./cc-test-reporter after-build --prefix ${PREFIX}
    
    # this runs tests with cc reporting built in
    test-ci: _before-cc test _after-cc
    
    Github Action나는 .github/workflows/run-build.yml 에서 이 파일을 저장했고, 나의 환매 기밀에서, 구축할 때 이 파일을 envvar로 내보낼 수 있도록 CC_TEST_REPORTER_ID 저장했다.
    name: Build Status
    
    on:
      push:
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Checkout master
          uses: actions/checkout@v2
    
        - name: Run unit tests
          run: |
            make clean test-ci
          env:
            CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
    
    런닝make test-ci은 코드climate reporter가 실행되는 상황에서 테스트를 실행하고 make test는 개발/디버깅에 사용되는 정상적인 단위 테스트만 실행합니다.
    위의 구성 결과는 다음 위치에서 볼 수 있습니다.
  • Github Action run ex
  • README ex
  • 즐거운 코딩!

    좋은 웹페이지 즐겨찾기