Sprint4-CI Unit Test report

🌻Truthful·2023년 12월 15일

이번에는 현재 GitLab에 업로드되어 있는 현재 프로젝트에 단위 테스트를 작성하고 CI를 구성하는 방법에 대해서 살펴보겠습니다.

우선 단위 테스트를 하기 위해서 아래의 라이브러리를 설치합니다.

pip install flask-testing pytest

tests 폴더를 만들고 그 안에 test_app.py 파일을 생성합니다.

저는 app.py를 단위 테스트 할 것입니다.

아래와 같이 테스트 코드를 작성합니다.

import pytest
import sys
from flask_testing import TestCase
sys.path.append('..')
from app import app


class MyTest(TestCase):
    def create_app(self):
        app.config['TESTING'] = True
        return app

    def test_login_page(self):
        response = self.client.get('/login')
        self.assertEqual(response.status_code, 200)


if __name__ == "__main__":
    pytest.main()

그리고 작성한 테스트 코드를 실행합니다.

pytest test_app.py

아래와 같이 테스트를 통과한 것을 터미널에서 확인할 수 있습니다.

이제 GitLab Unit Test를 활용해 봅시다.

만났던 문제점들

파이프라인 실행 자체가 안됨

깃 커밋으로 푸쉬했는데 파이프라인 자체가 실행이 안되더군요.

알고보니 다른 팀원이 코드에 아래와 같이 작성했더군요.

workflow:
    rules:
        - if: $CI_PIPELINE_SOURCE == "web"
          when: always

이것은 오직 웹에서만 파이프라인을 수정했을 때, 트리거되는 조건입니다.

왜 계속 안되는지 한참을 해맸네요.

그리고 edit 한 다음에도 아래의 Run pipeline을 실행해야 합니다.

이제 .gitlab-ci.yml 파일을 작성합니다.

workflow:
    rules:
        - if: $CI_PIPELINE_SOURCE == "web"
          when: always

include:
    - template: Terraform/Base.latest.gitlab-ci.yml

stages:
    - test
    - zipstage 
    - TeraAndAzCli

test:
    stage: test
    tags:
        - hva
    before_script:
      - apk add --update python3 py3-pip python3-dev mariadb-dev build-base

      - python -m venv venv
      - source venv/bin/activate

      - pip install --upgrade pip
      - pip install pytest flask_testing

      - cd flaskApp.Folder/Flask.App
      - pip install -r requirements.txt
    script:
        - ls
        - python -m pytest --junitxml=pytest.xml tests/
    artifacts:
        when: always
        paths:
            - flaskApp.Folder/Flask.App/pytest.xml
        reports:
            junit: flaskApp.Folder/Flask.App/pytest.xml

zipstage:
    image: joshkeegan/zip:latest
    stage: zipstage
    tags:
        - hva
    script:
        # ZIP the Flask.App
        - cd flaskApp.Folder/Flask.App/
        - zip -r Flask-App.zip ./*
        - ls
        - pwd
        # ZIP the Mixit-apotheek.Api
        - cd ../Mixit-apotheek.Api/
        - zip -r Mixit-apotheek-Api.zip ./*
        - ls
        - pwd
        # ZIP the Mixit-patient.Api
        - cd ../Mixit-patient.Api/
        - zip -r Mixit-patient-Api.zip ./*
        - ls
        - pwd
    artifacts:
        paths:
            - flaskApp.Folder/Flask.App/Flask-App.zip
            - flaskApp.Folder/Mixit-apotheek.Api/Mixit-apotheek-Api.zip
            - flaskApp.Folder/Mixit-patient.Api/Mixit-patient-Api.zip


TeraAndAzCli:
    stage: TeraAndAzCli
    # use Azure CLI image as a starting point
    image: zenika/terraform-azure-cli
    tags:
        - hva
    id_tokens:
        ID_TOKEN_1:
            aud: https://gitlab.fdmci.hva.nl
    variables:
        AZURE_CLIENT_ID: $AZURE_CLIENT_ID
        AZURE_TENANT_ID: $AZURE_TENANT_ID
        TF_STATE_NAME: default

    script:
        - az --version # CLI is included in image
        - terraform version # terraform is now installed!
        #... now you can use azure cli and terraform together.
        - az login --tenant $AZURE_TENANT_ID
          --service-principal
          --username $AZURE_CLIENT_ID
          --federated-token $ID_TOKEN_1
        - az account show
        - az account set --subscription $AZURE_SUBSCRIPTION_ID
        - az group list -otable
        - terraform -chdir=./tf-files init
        - terraform -chdir=./tf-files validate
        - terraform -chdir=./tf-files plan
        - terraform -chdir=./tf-files apply -auto-approve
        - ls
        - cd flaskApp.Folder/
        - ls
        - pwd
        - az webapp deployment source config-zip --name "website-740144f4" --resource-group "mixit-740144f4" --src Flask.App/Flask-App.zip
        - az webapp deployment source config-zip --name "ApotheekApi-840144f4" --resource-group "mixit-740144f4" --src Mixit-apotheek.Api/Mixit-apotheek-Api.zip
        - az webapp deployment source config-zip --name "PatientApi-940144f4" --resource-group "mixit-740144f4" --src Mixit-patient.Api/Mixit-patient-Api.zip

가장 에러가 많이 났던 부분은 바로 의존성을 설치해주는 부분이었습니다.

일일이 설치해주는 것은 비효율적이니 requirement.txt 도커이미지를 활용해주는 것이 좋습니다.

그리고 은근 경로를 찾아가는 것도 쉽지 않으니 ls 커맨드로 체크를 해주는 것이 좋습니다.

역시나 처음은 안돼.

역시나 처음부터 잘 될일은 없군요.

오류 수정

다른 브랜치에서 파이프라인을 실행을 하다가 아래와 같은 에러를 만났습니다.

Your version of Terraform is out of date! The latest version
is 1.6.6. You can update by downloading from https://www.terraform.io/downloads.html
$ az login --tenant $AZURE_TENANT_ID --service-principal --username $AZURE_CLIENT_ID --federated-token $ID_TOKEN_1
ERROR: AADSTS700213: No matching federated identity record found for presented assertion subject 'project_path:major-cloud-solutions/2324_sem_1/mixit-1:ref_type:branch:ref:Kim/sprint4/CI_UnitTest'. Please check your federated identity credential Subject, Audience and Issuer against the presented assertion. https://docs.microsoft.com/en-us/azure/active-directory/develop/workload-identity-federation Trace ID: 7bcbb45a-46fa-486d-ae67-92d966253b00 Correlation ID: c09fb089-fdf1-496d-8ea0-b202ec8f96c7 Timestamp: 2023-12-16 03:32:51Z
To re-authenticate, please run:
az login
Cleaning up project directory and file based variables
ERROR: Job failed: exit code 1

main 브랜치에서만 파이프라인이 성공하고, 다른 브랜치에서는 작동이 안되도록 막아놓은듯 합니다.

결국 main 브랜치에서 파이프라인 성공하였습니다.

📝 참고 자료

Unit test reports

profile
"인생의 목적은 타인을 따르는 것이 아니라 자신을 창조하는 것이다."

0개의 댓글