Skip to content

kmu2030/STUnit

Repository files navigation

STUnit

STUnitは、OMRON社のSysmac Studio向けの軽量単体テストフレームワークです。ライブラリ開発の単体テストが主な対象です。STUnitは、Sysmac Studio上で通常のプログラム同様にコードを作成し、Sysmacシミュレータ上でテストを実行、仮想SDフォルダにテスト結果を出力します。FA用途の性質を考慮して長期使用と安定性を求めた小規模で最小限の機能に絞った単体テストフレームワークを指向しています。また、ユーザープログラム上で完結するテスト環境とすることで、テスト対象とテストの寿命の一致を指向しています。

STUnitには、他の処理系のテストツールのような豊かな機能はありません。もし、STUnitが何らかの利益をもたらすとすれば、それは単体テスト自体の利益です。STUnitは、使うだけで利益を得られるわけではありません。テスト対象は、テストが可能であるように設計し、テストもテスト対象の価値を高めるものとして設計する必要があります。

制約

STUnitには以下の制約があります。

  • テストケースで実行可能なアサーションの数は128が上限
  • テストケースは並列に実行できない

環境

Sysmac Studio Version 1.61

対象CPU

CPUによって制約のある命令は使用していませんが、NX1P2は変数容量が少ないため使用できません。ライブラリのCPUは以下です。

NX102-9000 Ver. 1.50

構成

STUnitは以下で構成します。

  • STUnit.slr
    STUnitライブラリ本体です。

"STUnit.slr"の使い方

  1. このリポジトリをgit cloneまたは、Zipをダウンロードします。
  2. テストを記述するプロジェクトで"STUnit.slr"を参照します。
  3. "gSTUnitSingleton : STUnitContext"をグローバル変数に定義します。
  4. STUnitController FBのインスタンスを実行するPOUを作成し、タスクに登録します。
  5. テストを記述したPOUを作成し、4で作成したPOUに追加します。
  6. プロジェクトをビルドします。
  7. シミュレータまたは、実機で実行します。
  8. 仮想SDフォルダ("C:\OMRON\Data\SimulatorData\CARD\Memory001")または、SDカード内のテスト出力を確認します。

"STUnitExample.smc2"も確認してください。

"STUnitExample.smc2"の使い方

  1. このリポジトリをgit cloneまたは、Zipをダウンロードします。
  2. "STUnitExample.smc2"をSysmac Studioで開きます。
  3. "POU/プログラム/README"を確認します。
  4. プロジェクトをビルドします。
  5. シミュレータまたは、実機で実行します。
  6. 仮想SDフォルダ("C:\OMRON\Data\SimulatorData\CARD\Memory001")または、SDカード内のテスト出力を確認します。

"STUnitExample.smc2"は、"STUnit.slr"を含んでいます。

関連ツール

STUnitの使用に必須のツールはありませんが、テスト出力をモニタするツールがあると便利です。好みのターミナルで簡単なスクリプトを作成し、仮想SDフォルダを監視して確認できるようにすると効率が良くなります。私は、Git BashとinotifywaitのWindowsポートであるinotify-winを使用し、Git Bashを立ち上げて以下のスクリプトを実行しています。

#!/bin/sh

prev=$(date +%s)
clear_threshold=300

inotifywait -q -m \
	-e modify \
	-r 'C:\OMRON\Data\SimulatorData\CARD\Memory001' \
	--format "%w %f" |
while read -r dir file; do
	file=${file//[$'\r']};
	if [ ! -s "$dir\\$file" ]; then continue; fi

	now=$(date +%s);
	if [ $((now - prev)) -gt $clear_threshold ]; then
		clear;
	fi
	prev=$now;

	echo "$(date -d "@${now}" '+%H:%M:%S') $file";
	if [ -z "$(tail -1 "$dir\\$file" | grep 'Test suite has no failures.$')" ]; then
		cat "$dir\\$file" 2>/dev/null;
	fi
done

バージョニングとリリース

STUnitはSemantic Versioning 2.0.0を採用します。メジャーバージョンの更新でない限り、後方互換性を失うことはありません。長期使用と安定性を指向しているため、不具合の修正を除き頻繁なリリースは予定していません。各POUのバージョンは、STUnitのバージョンに同じとします。

STUnitは常に最新版のSysmac Studioを対象とします。そのため、Sysmac Studioの更新により後方互換性の無いライブラリをリリースする可能性があります。特にライブラリ仕様に大きな変更が加えられた場合に生じる可能性があります。恐らく、旧仕様のライブラリを出力する機能も実装されると思いますので旧仕様のライブラリしか使用できないコントローラ向けのSTUnitのリリースが止まる可能性は小さいと考えています。そのような場合、STUnitのリリース時に旧仕様のライブラリもリリースしますが、以下の時点でリリースを停止します。

  • リリース時の最新のSysmac Studioに旧仕様ライブラリの作成機能が無いとき
  • OMRON社が旧仕様のライブラリの使用を非推奨としたとき
  • 新仕様のライブラリが使用できる最も古いコントローラが発売された時点から数えてそのコントローラの耐用年数を過ぎたとき
  • STUnitが新仕様のライブラリの機能を使用するか、使用するPOUが新仕様のライブラリであることを要求するとき

Sysmac Studioのライブラリ仕様の変更によるライブラリとしての後方互換性の喪失が、STUnitの機能的な後方互換性の喪失を引き起こす可能性はほぼ無いと考えています。ライブラリに何らかの機能追加があったとしても、セキュリティーに関連するものでない限り、使用する可能性はまずありません。但し、ライブラリの依存性管理について大きな展開があり、有益と判断した場合は積極的に採用する可能性があります。

Sysmac Studioで使用可能なIEC61131-3仕様の大幅な変更が生じるなど単体テストに対する要求が大きく変化する場合、STUnitは根本的な継続性を失う可能性があります。それ以前のSTUnitが動作しなくなるということは考え難いですが、完全にメンテナンスモードに移行する可能性があります。

アルファ版に向けての変更

STUnitはアルファ版に向けて、以下の変更を予定しています。

破壊的な変更

  • データ型への名前空間の付与
    root名前空間に特別な用途を予定する可能性があるためです。

  • イプシロンを指定する実数型アサーションPOUの名称変更
    初期の名称であったRealEpsilonEq/Ne、LrealEpsilonEq/Neに戻します。私は合致していると思っていたのですが、必ずしも同値評価のみを目的にしたものではなかったので"Delta"としました。自分が戸惑ったので戻します。

非破壊的な変更

  • 各型の境界値を生成するユーティリティーPOUの追加
    私が不自由したためです。

  • 実数型の境界値生成ユーティリティーに機械イプシロンを追加