見出し画像

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の実行

スクリーンショット 2020-11-13 22.54.22

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

実行結果

スクリーンショット 2020-11-14 0.04.26

実行したコマンド(./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

この記事が気に入ったらサポートをしてみませんか?