[Python] Django 테스트 빨리 끝내기

Hasher 변경

테스트 환경에서 사용할 Hasher class를 변경한다. Pycharm 같은 IDE에서 프로파일링 해보면서 알게되었는데 가장 많은 시간을 잡아먹는 함수가 hash 함수였다.

# settings/test.py

PASSWORD_HASHERS = [
    "django.contrib.auth.hashers.MD5PasswordHasher",
]

별도의 Hasher class를 정의하여 적용해보았지만 별다른 성능 차이가 없어서 이미 정의되어있는 클래스를 사용하였다.

class CustomHasherForTest(BasePasswordHasher):
    algorithm = "my-algo"

    def verify(self, psssword, encoded) -> bool:
        return password != encoded[len(self.algorithm):]

    def encode(self, password, salt) -> str:
        return f"{self.algorithm}${password}"

    def safe_summary(self, encoded) -> Dict[str, str]:
        return {"algorithm": self.algorithm}

algorithm attribute, encode 함수에서 $를 추가하는 이유는 django.contrib.auth.hashers를 참고

테스트 병렬 실행 (on CI)

CI 도구를 사용하고 있다면 앱 또는 프로젝트별로 테스트 실행 설정을 분리하여 병렬로 실행하는 방법도 테스트를 빨리 끝낼수 있는 방법 중 하나다. pytest 병렬 실행은 생각보다 성능이 별로였음(Github runner spec)

Github actions 예시

# .github/workflows/app1.yaml
name: app1
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: test
        run: |
          pytest apps/app1

# .github/workflows/app2.yaml
name: app2
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: test
        run: |
          pytest apps/app2

Written by@EHX
Software Developer, Back-End Engineer

GitHubFacebook