誰も信用しない:テストの自動化
誰も信用しないで、誰も信用しないでください.サーバ開発者は常に疑って準備しなければならない.誰も信じていないので、信頼できるサーバを作成します.
コンピューターは盲目だ.間違いなく、マスターが作成したコードを実行します.自分でさえ間違いを犯す.プログラムの作成中にパソコンや他の電子機器が停止したという驚きの経験があります.
もし私たちが作成したWebサーバに欠陥があったら?サーバ開発で最も避けたいのは、500エラーがユーザーに露出することです.このような事態は防止しなければならない.つまり、サーバが実行される前に、欠陥が発見されるはずです.でも、どうしよう?
テストの自動化
コンピューターは盲目だ.間違いなく、マスターが作成したコードを実行します.自分でさえ間違いを犯す.プログラムの作成中にパソコンや他の電子機器が停止したという驚きの経験があります.
もし私たちが作成したWebサーバに欠陥があったら?サーバ開発で最も避けたいのは、500エラーがユーザーに露出することです.このような事態は防止しなければならない.つまり、サーバが実行される前に、欠陥が発見されるはずです.でも、どうしよう?
テストの自動化
テストオートメーションによって論理を確認することです.このコミットが既存のサーバを破壊しないという人を信じないでください.自動化されたテストで一貫性を検証するシステムを構築し、失敗した場合、サーバは受け入れられません.
自動化ツールの使用
そのためには、github action
やtravis ci
などの自動化ツールを用いることが望ましい.また、codecov
等により試験カバー率等を確認することもできる.
https://github.com/typelevel/cats/pull/3754のような例を見てみましょう.既存のコードとの一貫性を確保するために、複数の環境でテストを行います.
Githubから動作
ドッキングステーションの利用
現在稼働しているプロジェクトでは、最も簡単なgithub action
を使用してテスト自動化環境を構築しています.既にDocker
が使用されているため、テスト時にも既存の画像の使用が開始される.
github action
のyaml
ファイルの一部を修正します.jobs:
# Run tests.
# See also https://docs.docker.com/docker-hub/builds/automated-testing/
test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: create dotenv
run: echo "${{ secrets.DOTENV }}" > project/.env
- name: Log into GitHub Container Registry
run: echo "${{ secrets.TOKEN }}" | docker login https://docker.pkg.github.com -u ${{ github.actor }} --password-stdin
- name: docker build
run: docker-compose build
- name: test
run: docker-compose run test
docker-compose
ファイルは次のとおりです.version: "3.7"
services:
# 테스트를 위한
test:
build:
context: .
dockerfile: Dockerfile
environment:
- DJANGO_SETTINGS_MODULE=settings.${DEPLOY_STAGE:-dev}
env_file:
- project/.env
working_dir: /root
command: python manage.py test --keepdb
# 배포를 위한
rest-server:
build:
context: .
dockerfile: Dockerfile
environment:
- DJANGO_SETTINGS_MODULE=settings.${DEPLOY_STAGE:-dev}
image: docker.pkg.github.com/<path_to_image>
ports:
- "8000:8000"
env_file:
- project/.env
working_dir: /root
ドッキングファイルは次のとおりです.FROM docker.pkg.github.com/<path_to_image>
WORKDIR /root
ADD project .
RUN pip install -r ./requirements-dev.txt
上記のシステムにより、テスト自動化が構築されました.十分なテストケースがある場合は、少なくともこれらのシステムは安全です.
ドッキングを使用しない
今回は画像がなく、github action
容器で直接テストを実行しました.まずlocalhostを使用するため、環境にCI用のファイルを作成します.# settings/ci.py
from .base import *
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "github-actions",
"USER": "postgres",
"PASSWORD": "postgres",
"HOST": "localhost",
"PORT": "5432",
},
}
そして動作を修正しましょうtest:
runs-on: ubuntu-20.04
services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: github-actions
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: checkout code
uses: actions/checkout@v2
- name: Cache dependency # caching dependency will make our build faster.
uses: actions/cache@v2 # for more info checkout pip section documentation at https://github.com/actions/cache
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: create dotenv
run: echo "${{ secrets.DOTENV }}" > snulife/.env
- name: Setup python environment # setting python environment to 3.x
uses: actions/setup-python@v2
with:
python-version: '3.8.5'
- name: Install dependencies
run: pip install -r requirements.txt
- name: migrate and test
run: |
python manage.py migrate
python manage.py test
env:
DJANGO_SETTINGS_MODULE: settings.ci
ドッキングステーションに既に存在するpostgres
画像、health check
画像をコンテナ内で実行します.このプロシージャを実行しないと、データベースが実行される前にテストを迂回しようとし、失敗します.上記のコードはPostgreSQL
で記述されていますが、他のデータベースでも同様のコードを使用できます.- name: Cache dependency # caching dependency will make our build faster.
uses: actions/cache@v2 # for more info checkout pip section documentation at https://github.com/actions/cache
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
この部分はpip依存性管理でキャッシュを使用します.もちろんスピードを上げるためです.- name: migrate and test
run: |
python manage.py migrate
python manage.py test
env:
DJANGO_SETTINGS_MODULE: settings.ci
最後に、移行とテストを行います.インストールモジュールを指定するために、環境変数はDJANGO_SETTINGS_MODULE: settings.ci
で、この部分は自分の項目に応じて適切に変更されます.
結び目。
テストを自動化するだけで、システムの安定性を確保できますか?答えは否定的だ.何度テストを行っても、システム自体の安定性は保証されません.
テストは帰納法にかかわる.つまり、私が毎朝何度も太陽の昇りを確認しなくても、明日の朝太陽が昇るかどうか分からないのと同じです.
ソフトウェアが安全かどうかをより直接決定するには、より高いレベルの議論、すなわちタイプネットワークが必要です.しかし,静的タイプの導入は単純な議論ではない.言語を変え、枠組みを変え、組織全体の認識と思考構造を変えるからだ.
これに対する議論はひとまず棚上げにする.github action
を使用してテストと導入を自動化することから始めましょう.
Reference
この問題について(誰も信用しない:テストの自動化), 我々は、より多くの情報をここで見つけました
https://velog.io/@heka1024/아무도-믿지-마라
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
jobs:
# Run tests.
# See also https://docs.docker.com/docker-hub/builds/automated-testing/
test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: create dotenv
run: echo "${{ secrets.DOTENV }}" > project/.env
- name: Log into GitHub Container Registry
run: echo "${{ secrets.TOKEN }}" | docker login https://docker.pkg.github.com -u ${{ github.actor }} --password-stdin
- name: docker build
run: docker-compose build
- name: test
run: docker-compose run test
version: "3.7"
services:
# 테스트를 위한
test:
build:
context: .
dockerfile: Dockerfile
environment:
- DJANGO_SETTINGS_MODULE=settings.${DEPLOY_STAGE:-dev}
env_file:
- project/.env
working_dir: /root
command: python manage.py test --keepdb
# 배포를 위한
rest-server:
build:
context: .
dockerfile: Dockerfile
environment:
- DJANGO_SETTINGS_MODULE=settings.${DEPLOY_STAGE:-dev}
image: docker.pkg.github.com/<path_to_image>
ports:
- "8000:8000"
env_file:
- project/.env
working_dir: /root
FROM docker.pkg.github.com/<path_to_image>
WORKDIR /root
ADD project .
RUN pip install -r ./requirements-dev.txt
# settings/ci.py
from .base import *
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "github-actions",
"USER": "postgres",
"PASSWORD": "postgres",
"HOST": "localhost",
"PORT": "5432",
},
}
test:
runs-on: ubuntu-20.04
services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: github-actions
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: checkout code
uses: actions/checkout@v2
- name: Cache dependency # caching dependency will make our build faster.
uses: actions/cache@v2 # for more info checkout pip section documentation at https://github.com/actions/cache
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: create dotenv
run: echo "${{ secrets.DOTENV }}" > snulife/.env
- name: Setup python environment # setting python environment to 3.x
uses: actions/setup-python@v2
with:
python-version: '3.8.5'
- name: Install dependencies
run: pip install -r requirements.txt
- name: migrate and test
run: |
python manage.py migrate
python manage.py test
env:
DJANGO_SETTINGS_MODULE: settings.ci
- name: Cache dependency # caching dependency will make our build faster.
uses: actions/cache@v2 # for more info checkout pip section documentation at https://github.com/actions/cache
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: migrate and test
run: |
python manage.py migrate
python manage.py test
env:
DJANGO_SETTINGS_MODULE: settings.ci
テストを自動化するだけで、システムの安定性を確保できますか?答えは否定的だ.何度テストを行っても、システム自体の安定性は保証されません.
テストは帰納法にかかわる.つまり、私が毎朝何度も太陽の昇りを確認しなくても、明日の朝太陽が昇るかどうか分からないのと同じです.
ソフトウェアが安全かどうかをより直接決定するには、より高いレベルの議論、すなわちタイプネットワークが必要です.しかし,静的タイプの導入は単純な議論ではない.言語を変え、枠組みを変え、組織全体の認識と思考構造を変えるからだ.
これに対する議論はひとまず棚上げにする.
github action
を使用してテストと導入を自動化することから始めましょう.Reference
この問題について(誰も信用しない:テストの自動化), 我々は、より多くの情報をここで見つけました https://velog.io/@heka1024/아무도-믿지-마라テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol