テスト ツヌルのコンテナヌ化: Dockerfile ずメむクファむルの䜜成

投皿日: Jun 4, 2019

アプリケヌションをコンテナ化するこずの利点に぀いおはよく耳にしたすが、システム党䜓をテストするこずを目的ずしたアプリケヌションやアプリケヌションの テストをコンテナ化するこずの利点に぀いおはあたり耳 にしたせん。 コンテナ内でアプリケヌションのテストを実行するず、アプリケヌションが期埅どおりに実行されおいるこずをより確実に感じるこずができたす。 さらに、テストを Docker むメヌゞずしおパッケヌゞ化するこずで、耇数のマシン間でテストをすばやく実行し、䞀貫性のある環境を確保できたす。 この投皿では、テストツヌリングアプリケヌションのコンテナ化ず、ツヌルの単䜓テストず統合テストのコンテナ化に぀いお説明し、これらの利点を瀺したす。

ツヌリング

コンテナヌ化されるテスト ツヌルは、構成の異なる 5 ぀のオペレヌティング システムの珟圚のマトリックス党䜓で、Docker ゚ンゞン、ナニバヌサル コントロヌル りィンドり、および Docker Trusted レゞストリを含む Docker EE スタックのストレス テストに䜿甚される䞀連のツヌルです。 ツヌル自䜓には、いく぀かの重芁なプロパティがありたす。

  1. 独自の仮想 Python 環境で Python 3 で蚘述されおいたす
  2. 2぀の倖郚クラむアントバむナリを䜿甚
  3. システムテストを実行するための倖郚構成ファむルぞの3぀の䟝存関係がありたす
  4. 独自の単䜓テストず統合テストに合栌する
  5. すべおのシステムテストのログを収集したす

これらのプロパティは、ツヌルがコンテナヌ化されおいるかどうかに関係なく存圚したすが、このツヌルをコンテナヌ化するこずで、開発、コヌド管理、コラボレヌションがどのように容易になるかを芋おいきたす。この投皿には倚くの「テスト」甚語があるので、共通のベヌスから始めるために、それぞれのタむプのテストが私たちの目的のために䜕を衚しおいるのかを説明したす。

システムツヌルボックス: 実際のアプリケヌション/ツヌル。 これは、コンテナ化する完党なアプリケヌションず考えるこずができたす。

単䜓テスト: これらは、アプリケヌションの単䜓テストです。 倖郚䟝存関係はすべおモックされたす。コンテナ内で単䜓テストを実行したす。

統合テスト:これらは、ラむブシステムに䟝存する統合テストです。 これらのテストは、コンテナヌ内でも実行されたす。

ドッカヌファむルの䜜成

私たちのドッカヌファむル

1 パむ゜ンから:3.7.1
2
3 コピヌ ./client-binaries/Linux/<binary_1> /usr/local/bin/<binary_1>
4 COPY ./client-binaries/Linux/docker-18.09.4 /usr/bin/docker
5
6 ワヌクディレクトリ/system_toolbox
7 コピヌ ./pip-requirements/requirements.txt ./proj/requirements.txt
8 RUN pip install -r ./proj/requirements.txt
9
10 コピヌ ./統合テスト ./統合テスト11 コピヌ ./テストケヌス ./テストケヌス12
13 COPY ./sut-configs ./sut-configs14 コピヌ ./<binary_1>-configs ./<binary_1>-configs15
16 コピヌ ./ツヌルボックス 。/ツヌルボックス17
18 コピヌ ./メむクファむル 。/メむクファむル19 コピヌ ./README.md ./README.md
20 コピヌ ./setup.py ./setup.py
21 RUN make install-dev
22

コンテナヌ内のアプリケヌションを実行するには、むメヌゞに基づいおいる必芁がありたす。 珟圚䜜業しおいるプロゞェクトはPython 3で曞かれおいるので、ディレクティブを䜿甚しお FROM python:3.7.1 公匏に維持されおいるPythonむメヌゞからビルドしたす。 これは私たちの芪であり、ベヌスむメヌゞず呌ばれるこずもありたす。 私たちは 3.7.1 バヌゞョンのむメヌゞを䜿っおおり、Debian Linux (stretch ずも呌ばれたす) OS を提䟛しおいたす。 これは、ツヌルの䞀郚が Alpine Linux バヌゞョンには含たれおいない SSH クラむアントに䟝存しおいるためであり、Python のパッケヌゞマネヌゞャヌ pip を介しお Python SSH モゞュヌルである Paramiko をむンストヌルできる䟿利さを求めおいるためです。

前述のように、このプロゞェクトは 2 ぀の倖郚クラむアント バむナリに䟝存しおいたす。 ディレクティブを䜿甚しお COPY <src> <dst> 、これらを Dockerfile に含めたす。 このコマンドは、指定された宛先パスにあるむメヌゞのファむルシステムにバむナリをコピヌしたす。 䜿甚 COPY ずその代替コマンドADDの違いに぀いおのここでのメモ。 Dockerのベストプラクティスアプロヌチを䜿甚したすがADD、DockerCOPYむメヌゞ内のディレクトリずしお自動的に解凍される゜ヌスパスからtarアヌカむブを移動するなど、いく぀かの远加機胜がありたす。したがっお、ファむルやディレクトリをコピヌし、Dockerfileを過剰に゚ンゞニアリングしないずいう目的のために、 COPY 適切なコマンドです。

クラむアントバむナリの远加以倖のすべおのコマンドは内郚 /system_toolboxにあるため、 WORKDIR ディレクティブを /system_toolboxに蚭定したす。 これにより、コンテナ /system_toolbox 内の珟圚の䜜業ディレクトリが蚭定され、Dockerfile内の远加のテキストをクリヌンアップできたす。 たずえば、Dockerfile の 6 行目から 16 行目を次のように蚘述できたす。

6 コピヌ ./統合テスト /system_toolbox/統合テスト
7 コピヌ ./テストケヌス /system_toolbox/テストケヌス
8
9 COPY ./sut-configs /system_toolbox/sut-configs
10 コピヌ ./<binary_1>-蚭定 /system_toolbox/<binary_1>-configs
11
12 コピヌ ./ツヌルボックス /system_toolbox/ツヌルボックス
13

これはうたくいくでしょう。ただし、読みにくく、芪ディレクトリ構造に倉曎がある堎合は、すべおの行でこのパスを倉曎する必芁がありたす。 代わりに、ディレクティブを䜿甚しお、 WORKDIR 次のように各ステヌトメントを短瞮できたす。

6 ワヌクディレクトリ/system_toolbox
7 コピヌ ./pip-requirements/requirements.txt ./proj/requirements.txt
8 RUN pip install -r ./proj/requirements.txt
9
10 コピヌ ./統合テスト ./統合テスト11 コピヌ ./テストケヌス ./テストケヌス12
13 COPY ./sut-configs ./sut-configs14 コピヌ ./<binary_1>-configs ./<binary_1>-configs15
16 コピヌ ./ツヌルボックス 。/ツヌルボックス17

䜜業ディレクトリが蚭定されるず、䜜業ディレクトリが倉曎されない限り、次のコマンドはすべおそのディレクトリから実行されたす。 ドッカヌファむルの次の 2 行:

7 コピヌ ./pip-requirements/requirements.txt ./proj/requirements.txt
8 RUN pip install -r ./proj/requirements.txt

Python 芁件ファむルをコピヌし、ディレクティブを䜿甚しおこれらの芁件をすべおむンストヌルしたす RUN 。 この方法で RUN を呌び出すず、次のコマンド RUN がシェルで実行され、Linux コンテナヌでは既定で実行されたす /bin/sh -c 。

次の Dockerfile 行は、テスト、ラむブラリ コヌド、および必芁な構成ファむルを蚭定するためにツヌルによっお䜿甚されたす。

# ツヌルのコヌド粟床をテストするための統合テスト
コピヌ ./統合テスト ./統合テスト# ツヌルが実行するシステムテストケヌス
コピヌ ./テストケヌス ./テストケヌス# ツヌルの蚭定ファむル
COPY ./sut-configs ./sut-configs# ツヌルの蚭定ファむル
コピヌ ./<binary_1>-configs ./<binary_1>-configs# ツヌリングラむブラリ
コピヌ ./ツヌルボックス 。/ツヌルボックス

そしお最埌に、ドッカヌファむルの最埌の2行:

20 コピヌ ./setup.py ./setup.py
21 RUN make install-dev

Python セットアップ スクリプトをコピヌしおツヌルをパッケヌゞ化しお実行したす make install-devが、詳现に぀いおは Makefile セクションで説明したす。

メむクファむルの䜜成

メむクファむルの䜜成は、倚くの堎合、冒険です。 このセクションでは、ツヌルの実行を可胜にする䞻芁なコンポヌネントのいく぀かに぀いお説明したす。 たた、コンテナ内のツヌルをテストする単䜓テストず統合テストに぀いおも芋おいきたす。 Makefile のこの郚分は、むンストヌル タヌゲット、Docker タヌゲット、テスト タヌゲット、ナヌティリティの 4 ぀のセクションに分かれおいたす。 以䞋の Makefile の抜粋の埌には、ナヌティリティタヌゲットがバヌゞョンチェックを行うため、最初の 3 ぀のセクションの説明が続きたす。

1メゞャヌ?=0
2マむナヌ?=1
3
4 バヌゞョン=$(メゞャヌ).$(マむナヌ)
5
6 APP_NAME = "システムツヌルボックス"
7
8#私たちのドッカヌハブアカりント名
9#HUB_NAMESPACE = "<hub_name>"
10
11 #ドッカヌファむルの堎所
12 DOCKER_FILE_DIR = "ドッカヌファむル"
13 DOCKERFILE = "${DOCKER_FILE_DIR}/Dockerfile"
14
15 IMAGE_NAME = "${APP_NAME}"
16 CUR_DIR = $(シェル ゚コヌ "${PWD}")
17
18#Pythonフォヌマットチェッカヌ甚。 デフォルトは 78 です
19 PEP8_MAX_LINE_LENGTH = 99
20
21#ナニットテストオプション
22 NOSETEST_OPTS = --冗長性=2 --include='.*_test.py' --詳现゚ラヌ --どこ=ツヌルボックス
23 COVERAGE_OPTS = --カバレッゞあり --カバヌパッケヌゞ=ツヌルボックス --カバヌ-html --カバヌを含む --カバヌテスト --カバヌ消去 \
24 --cover-html-dir=../テスト結果/単䜓テストコヌドカバレッゞ
25
26 #################################
27#むンストヌルタヌゲット
28 #################################
29 .PHONY: install-dev
31 むンストヌル開発:
32 @echo "+ $@"
33
34 @pip -e をむンストヌルしたす。35
36 .停物:ピップフリヌズ
37 @echo "+ $@"
38 @pipフリヌズ|grep -v system_toolbox > pip-requirements/requirements.txt
39
40
41 #################################
42#ドッカヌタヌゲット
43 #################################
44 .停物:クリヌンむメヌゞ
45 クリヌンむメヌゞ: バヌゞョンチェック
46 @echo "+ $@"
47 @docker rmi ${HUB_NAMESPACE}/${IMAGE_NAME}:latest ||真
48 @docker rmi ${HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION} ||真
49
50 .停物:画像
51 画像: バヌゞョン チェック
52 @echo "+ $@"
53 @docker build -t ${HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION} -f ./${DOCKERFILE} .54 @docker tag ${HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION} ${HUB_NAMESPACE}/${IMAGE_NAME}:latest
55 @echo 「完了」。
56 @docker画像 --フォヌマット '{{.Repository}}:{{.Tag}}\t\t Built: {{.CreatedSince}}\t\tSize: {{.サむズ}}' |\
57 grep ${IMAGE_NAME}:${VERSION}
58
59 .停物:プッシュ
60プッシュ:クリヌン画像
61 @echo "+ $@"
62 @docker push ${HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION}
63 @docker push ${HUB_NAMESPACE}/${IMAGE_NAME}:latest
64
65 #################################
66#テストタヌゲット
67 #################################
68 .停物:テストナニット
69 テストナニット:
70 @echo "+ $@"
71 錻テスト ${NOSETEST_OPTS}
72
73 .フォニヌ:チェックFMT
74 #check-FMT: 画像
75 チェックFMT:
76 @echo "+ $@"
77 pycodestyle --ファむル名='*.py' --exclude='*.sh,*.md,*.txt,Makefile,*.swp' --max-line-length=${PEP8_MAX_LINE_LENGTH} *
78
79 .フォニヌ:テストスタティック
80テスト静的:
81 @echo "+ $@"
82 パむリント-d重耇コヌドテストケヌス
83 パむリントツヌルボックス
84 パむリント統合テスト
85
86 .停物:すべおテストしたす
87テストオヌル:チェックFMTテスト静的テストナニット
88
89 .停物:テストコンテナ
90テストコンテナ:画像
91 @echo "+ $@"
92 @docker run --rm --name toolbox-unit-tests ${HUB_NAMESPACE}/${IMAGE_NAME}:latest make test-all
93 @docker run --rm --name toolbox-int --volume ${CUR_DIR}/results:/root/logs -e REGISTRY_USERNAME=foo -e REGISTRY_PASSWORD=bar \
94 ${HUB_NAMESPACE}/${IMAGE_NAME}:latest python ./integration-tests/testbed_validation.py
95
96 .フォニヌ:統合-静的
97統合-静的:画像
98 @echo "+ $@"
99 @docker run --rm --name toolbox-int --volume ${CUR_DIR}/results:/root/logs -e REGISTRY_USERNAME=foo -e REGISTRY_PASSWORD=bar \
100 ${HUB_NAMESPACE}/${IMAGE_NAME}:latest python ./integration-tests/testbed_validation.py
101 #@python ./integration-tests/testbed_validation.py
102
103 .PHONY:統合-テストベッド-調査
104統合テストベッド調査:
105 @echo "+ $@"
106 @python ./integration-tests/testbed_validation.py --topology-filter=poc_ --sut-filter=${TESTBED_SURVEY_SUT} \
107 --create-system ${INTEGRATION_PERSONA} ${DRY_RUN}
108
109
110 #################################
111#ナヌティリティ
112 #################################
113
114 .PHONY: バヌゞョン チェック115バヌゞョンチェック:
116 @echo "+ $@"
117 if [ -z "${VERSION}" ];そうしたら\
118゚コヌ「バヌゞョンが蚭定されおいたせん」;\
119 誀り ;\
120 その他 \
121 echo "VERSION is ${VERSION}";\
122 fi
123

むンストヌル タヌゲット

むンストヌル タヌゲットには 2 ぀のコンポヌネントがありたす。 最初の install-devは Dockerfile から実行されたす。 RUN make install-devがドッカヌファむルで実行されるず、実行されたすpip install -e . コンテナ内。 これは楜しいコマンドであり、詳现を実際に把握するには少し掘り䞋げる必芁がありたした。

このコマンドの利䟿性を把握するために、ここではPython仮想環境に぀いお少し脇に眮きたす。 Python アプリケヌションを䜜成する堎合は、Python パッケヌゞず拡匵機胜を配垃するメカニズムである Distutils で䜿甚できるアプリケヌションの説明を提䟛するファむルを甚意 setup.py するのが䞀般的です。 より具䜓的には、Pythonのドキュメントから「セットアップスクリプトは、Distutilsを䜿甚しおモゞュヌルをビルド、配垃、およびむンストヌルするすべおのアクティビティの䞭心です。 セットアップスクリプトの䞻な目的は、モゞュヌルを操䜜するさたざたなコマンドが正しいこずをするように、Distutilsにモゞュヌルの配垃を蚘述するこずです。」

ただし、Pythonを䜿甚する堎合は、仮想環境で実行するようにすべおを蚭定するこずがよくありたす。 コヌドを倉曎するたびに䜜業ディレクトリを仮想環境にリンクするために繰り返すpython setup.py install必芁があるのは少し面倒な堎合があるため、存圚するディレクトリsetup.pyで実行できたすpip install -e .。これにより、倉曎を加えるファむルず仮想環境のパッケヌゞの間にsudoシンボリックリンクが䜜成されるため、最新バヌゞョンのPythonアプリケヌションを実行できたす。

むンストヌル タヌゲット pip-freezeの 2 番目の郚分 は楜しく、少しわかりやすくなっおいたす。 コンテナ内でテストを実行する必芁はありたせんが、Pythonで開発するずきに知っおおくず䟿利なコマンドです。 アプリケヌションが適切な数のパッケヌゞを蓄積しおいる堎合、 で requirements.txtすべおのバヌゞョンを自分で管理するのが難しい堎合がありたす。 このコマンドは、アプリケヌションず互換性のあるすべおのパッケヌゞバヌゞョンを取埗し、アプリケヌションのを requirements.txt 自動的に曎新するための優れた方法です。

ドッカヌタヌゲット

Docker タヌゲットでは、むメヌゞの䜜成ず保守に぀いお説明したす。 最初の clean-image ものは前提条件ずしお実行 version-check され、次に最新バヌゞョンず遞択したバヌゞョンの䞡方を削陀したす。 むメヌゞを削陀しようずしたずきにむメヌゞが存圚しないずいう゚ラヌが衚瀺されおも、テストツヌルがここでシャットダりンするこずはありたせん。したがっお、構文を䜿甚したす command  || true 。 ブヌル関数は垞にtrueを返し、スクリプトが䞍必芁に䞭止するのを防ぎたす。

むメヌゞの構築ずタグ付けには、 image タヌゲットを䜿甚したす。 これにより、前提条件のバヌゞョン チェックも実行され、指定された HUB_NAMESPACE, IMAGE_NAMEを䜿甚しお VERSION 、前に䜜成した Dockerfile からむメヌゞがビルドされたす。 次に、むメヌゞにタグが付けられ、むメヌゞが正しくビルドされ、 docker images タグ付けされたこずを確認するために実行されたす。

そしお最埌に、私たちのむメヌゞを clean-image プッシュするための、䞡方が image 前提条件です。 次に、最新バヌゞョンず最新のタグ付きむメヌゞの䞡方が Docker Hub にプッシュされたす。 Docker Hubにログむンしおいる堎合は、プッシュが自動的に完了し、それ以倖の堎合は、この手順でログむン資栌情報を入力する必芁がありたす。

テスト察象

「テスト タヌゲット」セクションでは、単䜓テスト、統合テスト、およびアプリケヌションをロヌカルで実行しおコンテナヌで実行するためのシステム ツヌルのタヌゲットに぀いお説明したす。

最初のタヌゲット test-unit は、Python 甚の Nose テスト パッケヌゞを䜿甚しおシステム テスト コヌドに察しお単䜓テストを実行し、Python 圢匏チェック パッケヌゞ Pycodestyle を䜿甚しおツヌルボックス コヌドのスタむル芏則をチェックし、システム テスト ケヌス、システム ツヌルボックス コヌド、 check-fmt test-static および統合テストに察しお Python リンタヌ Pylint を実行したす。

最埌の 2 ぀のタヌゲットは、Dockerfile で前に䜜成したむメヌゞを䜿甚しおコンテナヌでテストを実行するタヌゲットです。 タヌゲット test-container は単䜓テストを実行し、続いお統合テストを実行したす。 コマンド:

92 docker run --rm --name toolbox-unit-tests ${HUB_NAMESPACE}/${IMAGE_NAME}:latest make test-all

フラグを䜿甚しお--rmプロセスが完了したらコンテナを削陀し、フラグを䜿甚しおコンテナに特定の名前を指定し、むメヌゞ${HUB_NAMESPACE}/${IMAGE_NAMEの最新バヌゞョンを遞択したす}、--name:latestおよびコマンドmake test-allを送信したす。test-unitcheck-fmttest-staticdocker run

統合テストは、以䞋を呌び出すこずによっお実行されたす。

93 docker run --rm --name toolbox-int --volume ${CUR_DIR}/results:/root/logs -e REGISTRY_USERNAME=foo -e REGISTRY_PASSWORD=bar \
94 ${HUB_NAMESPACE}/${IMAGE_NAME}:latest python ./integration-tests/testbed_validation.py

これにより、システム ツヌルボックスに察しお統合テストが実行されたす。 たた、Dockerボリュヌムを䜜成しお、アプリケヌションから䜜成されたログファむルをロヌカルマシンに転送し、コンテナが削陀されたずきに衚瀺したす。 最埌に、実行する integration-static ず、コンテナヌ内の静的統合テストのみが実行され integration-testbed-survey 、ラむブ システムで統合テストが実行されたす。

コンテナヌ化されたテストを実行する方法

この蚭定の埌、私たちは今、私たちの仕事の報酬を享受するこずができたす。 コンテナヌ内ですべおのテストを実行する方法に぀いお説明したす。ツヌルボックスに察しおいく぀かのシステムテストを実行したいずしたしょう。この間に誰かがたたたたツヌルボックスラむブラリを倉曎した堎合、パッケヌゞのバヌゞョンが倉曎されたり、パむプラむン内の別のPRず無意識のうちに競合するラむブラリ機胜を远加したりした堎合、これは垞に楜しい「.... たあそれは私のマシンで動䜜したす」ずいう応答。

これを軜枛するために、Docker Hubリポゞトリにプッシュされおいるため、 make test-container 完党に機胜しおいるず確信しおいるむメヌゞから最初に単䜓テストを実行できたす。 次に、信頌できるむメヌゞに察しおも統合テストを実行したす。 これにより、マシン間で同じ環境でテストが実行されるようになり、䞀般的に開発が迅速になり、コヌディング゚クスペリ゚ンスがより楜しくなりたす。 ディレクトリ${CUR_DIR}/resultsをにリンク/root/logsするボリュヌムを䜜成したので、コンテナでの実行䞭にアプリケヌションによっお生成されたすべおのログファむルにアクセスするこずもできたす。

今埌は、コンテナヌでさたざたなテストを実行できるため、柔軟性が倧幅に向䞊したす。 異なるマシン間で䞀貫した環境でテストを実行し、朜圚的な競合を回避できるこずに加えお、゜ヌスコヌドずテストコヌドの䞀貫性を維持しながら、これらのテストを定期的に実行する自動Jenkinsゞョブの蚭定に適しおいたす。

関連蚘事