OpenCOBOLでunit testする
前回の記事では、Jenkinsを使った自動テストをしていましたが、本格的な開発になると複数のメンバーが利用するような環境になるので、できればJenkinsで動かす前に(Commitの前に)手元で動作確認しておきたい。
COBOLのUnit Testはなかなか大変なのですが、こちらの動画(YouTube)で紹介されていた Unit Testing Framework が良さそうだったので、使ってみることにしました。
実行環境
Docker Desktop for Mac version 2.4.0.0(48506)
macOS Catalina version 10.15.7
使用したFramework
https://github.com/neopragma/cobol-unit-test
Dockerの準備
今回使用するFrameworkが、ローカル環境だとうまく動かなかったので、Dockerに環境を構築します。Dockerfileは下記の通り(参考にしたURL)
FROM ubuntu
RUN apt-get update && \
apt-get install -y \
git \
open-cobol \
vim
RUN cd /home && \
git clone https://github.com/neopragma/cobol-unit-test cobut
WORKDIR /home/cobut
RUN cp envvars.example envvars && \
./compile ZUTZCPC && \
# set $PROJECT to /home/projects
sed -e 's|$PROJECT/src/main/cobol|/home/projects|' \
-e 's|$PROJECT/src/test/cobol|$MAINSRC/test|' \
-e 's|$TESTSRC/unit-tests|$MAINSRC/test|' \
-e 's|$PROJECT/src/test/resources|$MAINSRC/test|' \
-e 's|$TESTCPY|$PROJECT/src/main/cobol/copy|' \
envvars.example > envvars && \
# delete "export" from compile
mv compile compile.old && \
sed -e "/export/d" \
compile.old > compile && \
chmod +x compile
ここでは、DockerにOpenCobolをイントールして、Testing FrameworkをGithubからダウンロードし、その環境変数を変えています。
ダウンロードしたTesting Frameworkには、Frameworkのコアとなる部品とサンプルプログラムとが混在しているので、コンポーネントはDockerに配置し、テストするプログラムと設定ファイルは、PC側(Docker Host)に配置する方針とします。PC側のディレクトリを/home/projects/にマウントします。
DockerfileのBuild
最後のピリオド=カレントディレクトリを忘れない
$ docker build -t soo325/cobol-unit-test .
DockerのRun
ここではPC側の$HOME/CobolUnitTestをマウントしています。-itdオプションによりDockerコンテナが起動したままになります。
$ docker run -itd --rm -v $HOME/CobolUnitTest/:/home/projects \
--name cobut soo325/cobol-unit-test
Dockerにログイン
下記のコマンドでDockerの中のLinux環境にログインできます。ログインしないで実行する方法は後述します。
$ docker exec -it cobut bash
Unit Testの実行
PC側の$HOME/CobolUnitTest(Dockerの/home/projects)直下に、COBOLプログラム(SAMPLE.CBL)を置き、testフォルダの下にConfigファイル(SAMPLEC)とTestケース(SAMPLET)を置きます。ここではFrameworkのSampleをそのまま使いました。元々の格納先は下記の通りです。
./src/test/resources/SAMPLEC
./src/test/cobol/unit-tests/SAMPLET
./src/main/cobol/SAMPLE.CBL
テスト実行
ログイン直後のカレントディレクトリ( /home/cobut )で以下のコマンドを実行します。
$ ./run-ut SAMPLEC SAMPLE SAMPLET
実行結果
実行したコマンド(./run-ut)は、最初にテスト対象プログラム(SAMPLE.COBOL)とTestケース(SAMPLET)をマージして、TESTPRG.CBLを作成してからコンパイルします。
冒頭のwarningメッセージは、コンパイル時のもので、エラーでなければ無視して構いません(最初は驚きますが...)。
TEST SUITE: 以降がテスト結果になります。テストは2ケースあり、1ケース目はPASS、2ケース目はFAILとなっています。FAILのケースでは期待値(EXPECTED)と実際値(WAS)が表示されていますね。
Appendix
上記では、Dockerコンテナにログインして実行していましたが、ログインしないで実行する場合は、下記の通りです。
$ docker exec -it cobut ./run-ut SAMPLEC SAMPLE SAMPLET
また、docker run から docker exec のフローを省略して、docker run だけでも、テスト実行できます。
$ docker run -it --rm -v $HOME/CobolUnitTest/:/home/projects \
soo325/cobol-unit-test ./run-ut SAMPLEC SAMPLE SAMPLET
この記事が気に入ったらサポートをしてみませんか?