June 22, 2021
테스트 환경에서 사용할 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를 참고
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