このブログについて

ソフトウェア開発におけるエラーの予防やプロジェクト管理、品質管理を支援するParasoft製品のTIPSなどを、国内総販売代理店テクマトリックスのサポートスタッフが紹介しています。

2014年7月10日木曜日

「膨大なテストケース作成」と「テスト実行工数」を大幅に削減する画期的なテスト技法とは?



=====================================================

高機能化・複雑化が進むITシステムの品質確保
膨大なテストケース作成とその実行工数に悩まされていませんか?

=====================================================


例えば、金融システムに代表されるミッションクリティカルな基幹システムでは、数百から数万といった膨大な量のテストケースが作成され、テストが実施されています。
一方で、市場における競争力維持のためにリリースの短期化、開発コストへの圧力はますます強くなっている状況です。

開発現場は、このような「高品質」「短納期」「低コスト」という相互に矛盾した問題に頭を抱えているのではないでしょうか?


その解決策の1つが、テスト設計における【無駄や漏れが最少化されたテストケースの作成】と【効率的なテスト実行プロセス】です。

今回は産業技術総合研究所が研究中の最新のテスト設計技法をご紹介するとともに、その技法を活用したコストに見合うテストケース生成と効率的なテスト実行を実現するテストソリューションをご紹介します。
是非、ご参加ください。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆セミナー概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【開催日程】2014年8月7日(木)13:30~17:00 (開場:13:10)

【会場】アキバプラザ 6階 セミナールーム1
    東京都千代田区神田練塀町3 富士ソフト秋葉原ビル
    http://www.fsi.co.jp/akibaplaza/cont/info/access.html


【参費用】無料

【定員】60名(定員になり次第締め切らせていただきます。)
    ※同一部署からのご参加は、2名様までとさせていただきます。
    ※ご同業の方の参加はご遠慮いただいております。


【講演内容】
■モデルベーストテスト技法 FOT

【講師】
独立行政法人産業技術総合研究所
セキュアシステム研究部門 大岩 寛様・北村 崇師様

【概要】
FOT は産総研が研究開発するモデルベーストのテスト分析技術、及び、テストケース自動生成技術である。モデルベースト手法により系統的なテスト分析を支援し、自動生成技術により漏れ・重複のないテストケースを低コストで作成する。
本講演では、FOTの技術概要、及び、その産業システムへの適用事例について紹介する。
   

■「テスト計画の早期立案」と「効率的なテスト実施法」
【講師】
テクマトリックス株式会社

【概要】
設計段階から始める無駄のないテストケースの作成及び、テスト自動化ツールを活用したテスト実施法のデモを含め、テスト設計からテスト実施までのテストプロセスを効率的に進める方法を紹介する。


■テクマトリックスの製品とサービスのご案内

 ※内容は、変更する場合がございます。あらかじめご了承ください。


【申込方法】お申し込み受付ページからお申し込みください。

2014年6月12日木曜日

テストを複数回実施したカバレッジのログをマージする

■テストを複数回実施したカバレッジのログをマージすることは可能?

はい、可能です。
C++testのテスト実行時のカバレッジのログは、簡単にマージすることが出来ます。


単体テストを複数回に分けて実施した際、テストの結果・カバレッジのログを手動でマージしていませんか?

C++testのデフォルト設定では、実施した単体テストの回数分だけテストログが分割されます。今回ご紹介する内容は、それらのログを自動でマージする方法です。
自動でログをマージできれば、1つにまとまったテスト結果レポートを効率的に作成することが出来ます。

それでは具体的な設定例をご紹介いたします。

■ログファイルについて

C++testでは、以下の2つのログファイルにテスト結果情報とカバレッジ情報を保持しています。

  • テスト結果[cpptest_results.tlog]
  • テストの成功/失敗の情報を含むログファイル

  • カバレッジ[cpptest_results.clog]
  • テスト実行時のソースコードのカバレッジの情報を含むログファイル
     
これら2つのログファイルはテスト実行時に追記する形式として生成されます。
C++testデフォルトの設定では、テスト毎に2つのログファイルを削除する設定となっているため、毎回書き換えられているように見えます。
そのため、2つのログファイル(cpptest_results.tlog、cpptest_results.clog)を削除せず追記するように設定すれば、ログファイルのマージが可能になります。

■設定(テストコンフィギュレーション)の変更

以下の方法で、ログファイルを削除する設定を変更します。
単体テスト、及びアプリケーションモニタリング 用のテストコンフィギュレーションのダイアログより、処理フローを参照します。
    [実行]タブ → [全般]タブ → [テスト実行フロー]右の[編集]ボタンの処理フロー
処理フロー内に以下のような"RemoveFileStep"といったログファイルを削除する処理が記載されています。


このファイルを削除する処理を処理フローから削除することで、テスト結果とカバレッジのログをテスト毎に追加することができます。

■活用例

以下にカバレッジのマージの活用例をご紹介します

◆単体テストのカバレッジレポートをマージする
通常、上記のカバレッジをマージする設定を行わずに複数のテストを行った場合、GUI上では、カバレッジはマージされますが、レポートの出力結果は最後に実行したテスト結果のみになります。
  • テストケース1(calcFare関数のテスト)を実行し、GUI上でカバレッジを確認します
  • テストケース2(getFareInt関数のテスト)を実行し、1同様にカバレッジを確認します
  • GUI上ではテストケース1の結果も反映されカバレッジがマージされています
  • ですが、上記の実行結果のレポートを見てみますと
  • 結果がマージされておらず、最後の実行結果だけレポートされていることがわかります
  • ここで、カバレッジをマージする設定を実施後、再度同様にテストを実行し、レポートを出力すると
  • 上記のように、レポートもマージされたものが出力できます

◆アプリケーションモニタリングの結果をマージする
アプリケーションモニタリング の機能を使うことで、操作別のカバレッジの集計を取ることが出来ます。
例えば、以下のよう操作を実施したとします。
  1. アプリケーションを動作させ、操作1を実行
    →操作1実行時のカバレッジ情報を取得
  2. アプリケーションを動作させ、操作2を実行
    →操作2実行時のカバレッジ情報を取得
このように、操作1を実行した時のカバレッジと操作2を実行した時のカバレッジ情報をアプリケーションモニタリング機能で取得し、カバレッジの結果をマージすることで、最終的には実行された操作の分だけ、tlog、clogに結果が追記され、集計されたカバレッジを見ることができます。

■まとめ

いかかでしたでしょうか?
単体テストの結果ログファイルをマージすることで、複数の実行結果やカバレッジレポートを一つにまとめることができました。
実施するテストの内容によっては、一括で実行できない場合もありますので、そのようなシーンでもC++testを効率的にご活用いただけると思います。

今回ご紹介した内容については、こちらのユーザーページFAQで設定ファイル等のサンプルを公開する予定です。
その他にもユーザページでは C++test の便利な使い方をご紹介しています。是非、ご活用ください。

2014年5月13日火曜日

ESEC2014 出展!

今年も昨年に引き続き、東京ビッグサイトで開催される「組込みシステム開発技術展(ESEC)」に出展します。

第17回 組込みシステム開発技術展(ESEC 2014)
会期:2014.05.14(水)/15(木)/16(金) 10:00~18:00(16日(金)のみ17:00終了)
会場:東京ビッグサイト


2014年5月12日月曜日

医療機器ソフトウェアセミナー「2014年にみる医療機器ソフトウェアの規制と現状、および医療機器ソフトウェアのセキュリティ対策」開催レポート

4/14にソラシティカンファレンスセンターにて開催されました医療機器ソフトウェアセミナー
「2014年にみる医療機器ソフトウェアの規制と現状、および医療機器ソフトウェアのセキュリティ対策」は
多くのお客様にご来場いただき、盛況のうちに終了いたしました。

遠方からもご足労いただき、誠にありがとうございました。

ご都合により来場いただけなかった方で、セミナー内容にご興味のある方に、
当日資料の配布も実施しております。
ご希望の方は、お気軽にお問い合わせください。



=============================================================================

電子情報技術産業協会 医療用ソフトウェア専門委員会

平井 正明様


これまでの薬事法に代わり、2014年に施行される医薬品医療機器等法による医療機器ソフトウェアの規制・規格の動向について、ご紹介していただきました。


平井様によるセッションの様子


=============================================================================

テクマトリックスでは、医療機器ソフトウェアに関するセキュリティ対策として「CWE/SANS のセキュリティ上最も危険なソフトウェアバグ トップ 25」による対策例と、C++testによるセキュリティ対策のデモンストレーションを行いました。

医療機器ソフトウェアに関係するセキュリティ対策

Parasoft社のC++testによるセキュリティ対策デモンストレーション

実機を使ったバッファオーバーフローの再現

テクマトリックスでは、医療機器ソフトウェアについて、IEC およびFDA適合対応に関係する 無料相談会を開催しております。ソフトウェア開発から申請までの規格適合全般について、ご相談を承りますので、お気軽にお問い合わせください。

【相談例】
ISO 14971とIEC 62304の関係について知りたい
FDAで求められるテストカバレッジが知りたい
IEC 62304適合を目指すが何から手を付けて良いかわからない
テクマトリックスが提供するコンサルティングサービス、教育サービスについて詳しく知りたい
IEC 62304対応の文書化はどこまで必要か知りたい




今回のご紹介させていただいたParasoft社製テストツールC++testの詳しい情報、無償体験版ダウンロードはこちら↓です。


 



2014年4月30日水曜日

Java8リリース!!

2014年3月18日(日本時間の3月19日早朝)、Javaの最新バージョンとなるJava8が米オラクルから正式に公開されました。
今回のParasoftブログではJava8で追加された新機能をいくつかご紹介していきます。


■ラムダ式

Java8で1番着目されている「ラムダ式」は、関数型インタフェース(実装すべきメソッドを1つだけ持っているインタフェースのこと)のメソッドを実装する際に使うことが出来ます。

基本構文
 ( 実装するメソッドの引数 ) -> { 処理 }

例えば、int型の変数2つを引数に持ち処理結果を返すようなメソッドは以下のように記述できます。
{ } の中に処理したい内容を記述します。
 (int x, int y) -> { return x + y; }

また、引数や戻り値型を型推論してくれるので、次のようにも記述できます。
 (x, y) -> { return x + y; }

※複数の引数がある場合に、記述有と記述無を同時に使用することは出来ません。

例をあげると、Comparatorを使ったコレクションのソートを記述するとき、これまでは匿名クラスを使って次のように記述していました。
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
list.sort(new Comparator<String&gt() {
    @Override
    public int compare(String s1, String s2) {
        int ans = s1.length() - s2.length();
        return ans;
    }
});
これをJava8で型推論とラムダ式を使うと次のようになります。
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
list.sort((s1, s2) -> s1.length() - s2.length());
Java7までの「@Override」でオーバーライドしなければならないメソッドの宣言が必要だったのに比べると、全体の記述量が減り、コードも見やすくなっていることが分かります。

Comparatorの他にも次のような関数を使用することが出来ます。
 ・Function<T, R> … 引数1つ、戻り値あり
 ・BiFunction<T, U, R> … 引数2つ、戻り値あり
 ・UnaryOperator<T> … 単項演算子
 ・BinaryOperator<T> … 二項演算子

Java8の新機能はラムダ式以外にもありますが、ラムダ式はそれらの新機能を有効的に使えるように設計されています。
この次にご紹介する「Stream API」はもちろん、これまでも利用していた「コレクションAPI」もラムダ式を活用するためメソッドが変更されています。
例えば、java.util.Listにはメソッドの引数にラムダ式を記述することが出来ます。
これまでコレクション要素を1つずつ取り出すのにイテレータやカウンタを使用していましたが、ラムダ式を使えば、forEach()の引数にラムダ式を記述することで実現できます。

これまでのイテレータを使った方法:
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
for(Iterator i = list.iterator(); i.hasNext();){
    System.out.println(i.next());
}
Java8のラムダ式を使った方法:
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
list.forEach(x -> System.out.println(x));
どちらの場合も同じ結果が得られます。
Jtest
dotTEST
SOAtest
Virtualize
見た目はそこまで大きな変化が見られないかもしれませんが、処理の仕方が大きく変わります。
これまでは本質的に順次処理であり、要素をコレクションに格納されている順に処理しなければいけませんでしたが、ラムダ式を使う場合、処理の対象(ここでは”list”)を指定する必要はあるものの、処理の方法については指定しなくても効率的な順序で処理するためにライブラリで把握しているメモリ内のデータの位置情報を利用して処理され、開発者は正しい答えをより早く得ることができます。
今回はforEach()メソッドを使いましたが、java.util.Listでは以下のメソッドも利用することができます。

メソッド名 処理
 forEach()  Listの各要素に対して繰り返し処理を行う
 sort()  Listの要素をソートする
 replaceAll()  Listの各要素を置換する
 removeIf()  指定した条件に一致する要素をListから削除する

また、コレクションの1つであるjava.util.Mapでも以下のメソッドで追加/変更が行われています。

メソッド名 処理
 forEach()  Mapの各要素に対して繰り返し処理を行う
 putIfAbsent()  指定した値が存在しない場合Mapに値を追加する
 replace()  指定したキーが存在する場合値を上書きする
 replaceAll()  Mapの各要素を置換する
 compute()  指定したキーでMapに追加する

ラムダ式の基本的な機能をご紹介いたしましたが、これまでとは全く違ったプログラミング記法で、戸惑う方も出てくるかもしれません。
記述量が減る、処理の追加や変更が行いやすいというメリットはあるものの、慣れるまでは何をしているのか解読しづらいコードが出てくることも想定されます。
ラムダ式のメリットを生かしつつ、誰にでもわかりやすいコーディングを意識する必要もありそうですね。


■Stream API

新規に追加されたAPIとしてjava.util.streamが挙げられます。
このStream API は今回の例に出したようにラムダ式と組み合わせることを想定としているようです。Stream APIを使用すると、コレクションのデータをストリームのソースとして入力し、データを加工、処理する操作をシンプルに記述することが出来ます。
Stream APIではコレクション要素の加工を簡単に行えるようになり、1つずつの処理をfor文でループしながら行う必要があった複数の処理も1文で記述が可能になります。

これまでの方法:
public class StreamAPI {

    public static void main(String[] args) {
        List<String> list 
             = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
        list = changeUpper(list);
        list = sort(list);
        output(list);
    }
    
    public static List<String> changeUpper(List<String> list) {
        List<String> upperList = new ArrayList<>();
        for (Iterator i = list.iterator(); i.hasNext();) {
            String str = i.next().toString();
            upperList.add(str.toUpperCase());
        }
        return upperList;
    }
    
    public static List<String> sort(List<String> list) {
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int ans = s2.length() - s1.length();
                return ans;
            }
        });
        return list;
    }
    
    public static void output(List<String> list) {
        for (Iterator i = list.iterator(); i.hasNext();) {
            System.out.println(i.next());
        }
    }
}
Stream APIを使った場合:
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
list.stream()
        .map(s -> s.toUpperCase()) //引数を大文字化
        .sorted((a, b) -> b.length() - a.length()) //文字列長で並べ替え
        .forEach(System.out::println); //リストの要素数分出力
どちらの場合も同じ結果が得られます。
VIRTUALIZE
DOTTEST
SOATEST
JTEST
上記の比較でも、Stream APIを使用することでカウンタとして利用するためだけの変数や、複数のメソッド(今回の例は大げさではありますが…)を用意する必要はありません。
また、Stream APIの処理は上から順に実行されますのでデータが加工される流れをソースコード上で確認することも簡単に行えます。さらに、データの流れを意識した処理を記述できるので、一部の処理に変更が入ったとしても簡単に修正ができ、他の処理への影響度もすぐに把握できるので保守開発時のデグレード発生率が下がることも期待できます。

さらに処理の実行タイミングに関して「遅延」という概念が追加されました。
これまでソースコード上の式の値を評価するタイミングは式の値を変数に格納するか、関数に渡した直後でしたが、この「遅延」の概念を利用すると式の値は、その値が必要となった時に初めて評価されるようになります。
例えば以下のコードがある場合、Stream型の変数を評価するための式をskip()で記述した後に、実際に評価されるStreamのデータをListに格納しています。
List<String> list = new ArrayList<>();
Stream<String> st = list.stream().skip(2); 
//ListをStreamに変換しつつ、処理を飛ばす要素数を定義
System.out.println("処理開始"); 

list.add("Jtest");    
list.add("dotTEST");
list.add("SOAtest");
list.add("Virtualize");

st.forEach(x -> System.out.println(x));  
//Stremを予め定義した(skip()メソッドで)情報で処理
System.out.println("処理終了");
実行結果は以下のようになります。
処理開始
SOAtest
Virtualize
処理終了
この例から、変数stに対するskip()の処理をコードで記述した後、実際に使用する際に実行していることが分かります。

また、Stream APIを使うと、コレクションの並行処理を簡単に実装できるようになったことも大きな変化であると言えます。
parallel()という1つのメソッドをストリームに渡すと、それまで直列的であったコレクションの処理も並列可能なStreamであれば処理が自動的に並列化され、コレクションの大きさが大きければ大きいほど、これまでと比較して処理速度の向上が見込まれます。

parallel()の使用例:
List<String> list = Arrays.asList("Jtest", "dotTEST", "SOAtest", "Virtualize");
list.stream()
        .parallel() //並列化を宣言
        .map(s -> s.toUpperCase()) //引数を大文字化
        .sorted((a, b) -> b.length() - a.length()) //文字列長で並べ替え
        .forEach(System.out::println); //リストの要素数分出力
実際に使う際には実現したい処理への影響や効果的な順序等、考慮するべき点はたくさんありますが、「遅延」の概念や並行処理を利用することでJavaの最適化をはかることが出来そうです。


■タイプアノテーション
これまではパッケージやクラス、メソッド等の宣言対象に付与していたアノテーションが、Java8からは型の利用に対してもつけられるようになりました。
例えば、変数の型や、ジェネリクスの型パラメータに対してアノテーションをつけることができます。

下の例では変数の型にアノテーションをつけています。
public static void main(String[] args) {              
    //@NotNull を付与することで、myObj に null が格納されることを許容しない
    @NotNull MyObject myObj = getMyObject();
    System.out.println(myObj.toString());
}

private static MyObject getMyObject(){
    return null;
}
このコードで@NotNullを外した場合、実行時に「java.lang.NullPointerException」が発生します。
タイプアノテーションを付与しておくことで、バグを減らすためのチェックをコンパイル時に出来るようになります。

変数だけでなく、以下のような使い方も可能です。
 ・new @Interned MyObject(); //コンストラクタ
 ・String str = (@NotNull String)myObj; //キャスト
 ・List<@NotNull String> list; //ジェネリック型


■まとめ

今回は、Java8の新機能の一部を簡単にご紹介しました。
ご紹介出来なかった機能もたくさんあり、Java8のリリースでJava開発が大きく変わるのは間違いなさそうです。
ラムダ式やStream APIの導入でソースコードの記述が簡略化されることが想定されますが、慣れるまではなかなか大変そうな印象を受けました。
タイプアノテーションを使うとコーディングの段階でバグを減らすチェックを行えるなど品質向上の面でもメリットがありそうですが、記述方法も大きく変わることもあり、コンパイルチェックで出来ること、出来ないことをきちんと判断して、フロー解析などの高度なことはツールを導入するなどうまく活用していく必要があるとも感じました。

Parasoft JtestはJava7には対応しておりますが、Java8の対応も準備中です!!

2014年3月7日金曜日

C++test事例セミナー「より高品質なソフトウェア開発を目指せ!事例から学ぶ品質確保!」開催レポート

2/25に秋葉原UDXギャラリーネクストにて開催されました
「より高品質なソフトウェア開発を目指せ!事例から学ぶ品質確保!」
事例セミナーは多くのお客様にご来場いただき、盛況のうちに終了いたしました。

遠方からもご足労いただき、誠にありがとうございました。

ご都合により来場いただけなかった方で、セミナー内容にご興味のある方は、
こちらまで、お気軽にお問い合わせください。


会場の様子

=============================================================================

東芝機械株式会社

青野 竜二様(写真上)

頴川 裕一様(写真下)

産業用機械やロボットの安全性能を証明する

『機能安全国際規格IEC 61508』の認証取得までのプロセスとツールの活用


一般に「3年はかかる」と言われるIEC 61508認証(SIL3)の取得を、わずか「約1年半」で取得するという興味深い内容でした。認証取得を実現した企業だからこそ、お話しできる経験を交えた貴重な講演内容でした。






=============================================================================

名古屋大学大学院情報科学研究科附属 組込みシステム研究センター(NCES)

鴫原 一人様

「ET AWARD 2013オートモティブ/交通システム部門 優秀賞」を受賞した

『AUTOSAR仕様の車載制御システム向けリアルタイムOS』開発における

品質向上への取り組み


今回、ご講演いただいた『車載制御向けリアルタイムOS』は、昨年11月に行われたエンベデッドテクノロジー展の「ET AWARD 2013 オートモティブ部門」にて優秀賞」を受賞されています。
さすが研究者と言わせる講演内容で、カバレッジ計測ツールの仕組みに触れるような深い内容でした。



=============================================================================

テクマトリックスではそれぞれの事例に合わせたツールのデモを実施。

今回の事例では、弊社の取り扱うParasoft社製テストツールC++testが活用されていました。
それぞれの事例で利用された機能の紹介のほか、ターゲット機での単体テストも実演しました。




今回、ご紹介させていただいた事例については、テクマトリックスサイトでもご紹介中です。

▼C++test導入事例
 東芝機械株式会社様
 名古屋大学大学院情報科学研究科附属 組込みシステム研究センター

他にも多くの事例をご紹介中です。ツールご検討の際には是非、ご参考ください。

また、今回の事例でご紹介させていただいたParasoft社製テストツールC++testについての
詳しい情報、無償体験版ダウンロードはこちら↓です。



 





2014年3月5日水曜日

Parasoft C++test 製品 FAQページのご紹介

C++testのユーザの皆様、いつもお世話になっております。 
Parasoft製品サポートでございます。

今回は私たちサポートスタッフが C++test 製品FAQページ をご紹介いたします。

C++test 製品 FAQページでは、お客様からよくお問い合わせいただく項目やバージョンアップの際に気を付けていただきたい項目など、製品をよりよくご使用いただくためのヒントをQ&A形式でまとめています。


その他にも、ユーザ様専用ページでは、チュートリアルや便利な機能のご紹介など、C++testをより有効にご利用いただくための情報を 技術資料 としてご提供しております。


プロジェクトの作成手順など、マニュアルではわかりづらい部分についての補足資料もございます。
ユーザの皆様は、この機会にぜひご活用ください!


ご紹介した C++test 製品 FAQページ は定期的に更新しておりますので、製品に関する疑問点などございましたら、是非アクセスしてみてください。

※ C++test 製品 FAQ(ユーザ様専用ページ)のURLについては、「ユーザ登録カード」をご参照下さい。
※ 「ユーザ登録カード」は製品をご購入頂いた際に、お客様のお手元にお届けしております。ご不明な場合は、弊社までお問い合わせください。

C++testの最新バージョンは、体験版としてお試しいただくことができます。
体験版ダウンロードはこちらから。