My Photo
無料ブログはココログ
September 2019
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

他のアカウント

お気に入りのもの

  • SONY: SONY PHA-2
  • iCOP: VESAPC eBOX3310 VEPCEB31
  • Windows Embedded CE 6.0組み込みOS構築技法入門 (マイクロソフト公式解説書)

WinCE6.0 CETKの実施 - その4

これでCETKのシリーズはいったん終了となります。

CETKの特徴としてKatoエンジンによるログの出力があります。このログではテストの合否はもちろんわかりますが、適切なログ出力を実装することで、不合格時の原因を追究することができます。またこのログを保存することでテスト結果の記録として残すことができます。なおログの保存先は以下になりますが、最初はちょっとわかりにくいです。

C:\Program Files\Microsoft Platform Builder\6.00\cepb\wcetk\results

この位置はログを保存するときにダイアログで表示されますので確認をしておいてください(下図ではDドライブになっています)。

Cetk_save_01

今回のテストを実行するとこのファイルのような結果が得られます。このファイルを見るとテストの条件や結果を簡単に確認することができます。まず先頭ですがテストの基本条件が記録されています。パッと見るだけでもテストを2件実施したこと、ARM+WinCE6.0であること、メモリの状態などを読み取ることができます。今回のテストでは「Suite Name」、「Suite Description」を記述していなかったのでN/Aになっていますが、ここに適切な記述を設定をするとより分かりやすくなります。

*** ==================================================================
*** SUITE INFORMATION
***
*** Suite Name:        N/A (built on the fly)
*** Suite Description: N/A
*** Number of Tests:   2
*** ==================================================================

*** ==================================================================
*** SYSTEM INFORMATION
***
*** Date and Time:          05/07/2008 11:09 AM (Wednesday)
***
*** Device Name:
***
*** OS Version:             6.00
*** Build Number:           2217
*** Platform ID:            3 "Windows CE"
*** Version String:         ""
***
*** Processor Type:         0x00000A11 (2,577) "StrongARM"
*** Processor Architecture: 0x0005     (5) "ARM"
*** Page Size:              0x00001000 (4,096)
*** Minimum App Address:    0x00010000 (65,536)
*** Maximum App Address:    0x7FFFFFFF (2,147,483,647)
*** Active Processor Mask:  0x00000001
*** Number Of Processors:   1
*** Allocation Granularity: 0x00010000 (65,536)
*** Processor Level:        0x0004     (4)
*** Processor Revision:     0x0001     (1)
*** ==================================================================

*** ==================================================================
*** MEMORY INFO
***
*** Memory Total:    59,691,008 bytes
*** Memory Used:      8,445,952 bytes
*** Memory Free:     51,245,056 bytes
***
*** Kernel Used:        278,528 bytes
*** Water Mark:          12,511 pages
***
*** Store Total:     59,584,512 bytes
*** Store Used:         303,104 bytes
*** Store Free:      59,281,408 bytes
*** ==================================================================


そしてこのテストのサマリーがファイルの最後に記録されます。

*** ==================================================================
*** SUITE SUMMARY
***
***
Passed:          1
***
Failed:          1
***
Skipped:         0
***
Aborted:         0
*** -------- ---------
***
Total:           2
***
*** Cumulative Test Execution Time: 0:00:00.026
*** Total Tux Suite Execution Time: 0:00:00.243
*** CPU Idle Time:                  0:00:00.000
*** ==================================================================

ここではテストを2件実施して、1件は成功、1件でエラーが発生したことがわかります。そしてスキップしたり途中で終了したテストはありません。もちろん“Failed”ということでエラーが発生した場合は、その原因追求と対策が必要です。それに対して“Skipped”や“Aboarted”はその理由を明確にすることで、テストの結果として表れても問題が無い場合があります。これらの発生原因についてはソースを確認するなりして判断をしてください。

それでは今回のテストのエラー原因を確認してみます。テスト結果のログにはこのエラーに関する情報が含まれています。

BEGIN GROUP: TuxDriver01.DLL
   <TESTCASE ID=1>
   *** vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   *** TEST STARTING
   ***
   *** Test Name:      Sample test 1
   *** Test ID:        1
   *** Library Path:   \tuxdriver01.dll
   *** Command Line:
   *** Kernel Mode:    No
   *** Random Seed:    18353
   *** Thread Count:   0
   *** vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   BEGIN TEST: "Sample test 1", Threads=0, Seed=18353
      Driver01.dll IoControl test Starting
      Driver01.dll Test - Open Driver01.dll
      Driver01.dll Test - Open Driver01.dll OK
      Driver01.dll Test - CMD_IOCTL_NO1 OK
      Driver01.dll Test - CMD_IOCTL_NO2 OK
      Driver01.dll Test - CMD_IOCTL_NO3 OK
      
Driver01.dll Test - CMD_IOCTL_NO4 is FAILED
   END TEST: "Sample test 1", FAILED, Time=0.018
   *** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   *** TEST COMPLETED
   ***
   *** Test Name:      Sample test 1
   *** Test ID:        1
   *** Library Path:   \tuxdriver01.dll
   *** Command Line:
   *** Kernel Mode:    No
   *** Result:         Failed
   *** Random Seed:    18353
   *** Thread Count:   1
   *** Execution Time: 0:00:00.018
   *** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

このログを見るとわかるのですが、Driver01.dllのテストでDeviceIoControl関数を呼び出しています。そしてCMD_IOCTL_NO4の呼び出しでエラーが発生しています。ここでこのエラーがなぜ発生したのかを探ることにします。

CETKのソースコードtest.cppを見ると以下のようになっています。TestProc1関数ではDeviceIoControl関数を呼び出して、引数にCMD_IOCTL_NO4を渡しています。そして関数の戻りがエラーとなっているため、エラーログを出力していることがわかります。

    // CMD_IOCTL_NO4
    if ( DeviceIoControl( hDrv01,
CMD_IOCTL_NO4, NULL, 0,
                                    &dwValue, sizeof(DWORD), &dwReturnValue, NULL ) ){
        if ( dwValue == 4){
            g_pKato->Log(LOG_COMMENT,
                                    TEXT("Driver01.dll Test - CMD_IOCTL_NO4 OK"));
        }
        else{
            
g_pKato->Log(LOG_COMMENT,
                                    TEXT("Driver01.dll Test - CMD_IOCTL_NO4 is invalid return value"));

            tRet = TPR_FAIL;
        }
    }
    else{
        g_pKato->Log(LOG_COMMENT,
                                    TEXT("Driver01.dll Test - CMD_IOCTL_NO4 is FAILED"));
        tRet = TPR_FAIL;
    }

このテストによって呼び出されているのはDriver01.cのDRV_IOControl関数です。この関数で引数によって渡されるコマンドの制御を確認してみます。

    switch ( dwIoControlCode ){
        case CMD_IOCTL_NO1:
        *(DWORD *)pOutBuf = 1;
        *pBytesReturned = sizeof(DWORD);
        break;
    case CMD_IOCTL_NO2:
        *(DWORD *)pOutBuf = 2;
        *pBytesReturned = sizeof(DWORD);
        break;
    case CMD_IOCTL_NO3:
        *(DWORD *)pOutBuf = 3;
        *pBytesReturned = sizeof(DWORD);
        break;
    default:
        RetVal = FALSE;
        break;
    }

ソースを確認するとわかるのですが、このDRV_IOControl関数ではCMD_IOCTL_NO4の処理が実装されていません。このようにCETKを通すことで、実装すべき処理の抜けを発見することができたわけです。このドライバの不具合は発見できましたので、その対策は容易です。

以上のように、CETKを通すことでデバイスドライバの不具合を発見することが可能です。最後になりますが、CETKを通すメリットをまとめます。

  • WinCEのテスト用フレームワークに準拠しているため、テストの実行が容易。
  • サーバークライアント型のテストとなっていて、テストの制御や結果の取得が簡単にできる。
  • ユーザー作成のテストを追加できることから、テストプログラムが開発資産となる。
  • CETKのフレームワークに合わせてユーザーテストを作成することができるため、テストの開発が比較的容易。
  • Katoエンジンによるロギングができることから、その結果をきちんとした形で残すことができる。
  • 常に同一のテストを行うことで、変更・修正後のデグレのチェックが可能。

プラットフォームのテストではCETKを必ず使わなくてはならないというものではありません。しかしCETKはフレームワークとして見るとよくできたシステムです。ぜひユーザーテストを追加して、テスト資産を増やしてみてください。

WinCE6.0 CETKの実施 - その3

すっかり昔の話ですが、CETKの説明が中途で止まっていました。続きを書こうと思ったのですが、どういうつもりで書いていたのか、思い出すまで時間がかかりました。

ということでしばらくぶりに話を続けます。前回はCETKへのユーザーテストの追加方法までの解説でしたが、実際にCETK用に定義したTux.DLLの内容を見てみます。まずはTux.DLLを新規に開発する際にポイントとなる部分です。なお使用するサンプルソースは前回のCETKの解説「WinCE6.0 CETKの実施 - その2」で提示したものをそのまま使用します。

【Test.cpp】

このファイルはテスト用関数が記述されています。今回のサンプルソースでは以下の2つの関数がテスト用として実装されています。これらの関数には実際のテストのソースコードが記述されていることを確認してください。

  • TestProc1()
  • TestProc2()

またこれらのコードを見てみると、以下のような文を見ることができます。   

    g_pKato->Log(LOG_COMMENT, TEXT("Driver01.dll IoControl test Starting"));

この文はCETKの標準ロギングエンジンであるKatoエンジンに対してログを出力するためのものです。テスト結果を見る時はこの出力が最初の確認になりますので、その出力情報は十分に吟味してください。

そして関数の返値としてtRetが定義されています。このテスト関数はこの返値に対して以下の値を設定することが求められています。

  • TPR_NOT_HANDLED:テスト関数がTuxでの同一スレッドで実行される場合、THREAD_COUNTの問い合わせに対する回答に対してのみ使用される。
  • TPR_SKIP:テストケースを実行しなかった。
  • TPR_ABORT:テストケースを機能テストで検証することができなかった。
  • TPR_FAIL:テストされた機能が正しくない動作を示した。
  • TPR_PASS:テストケースが完全に実行された。

【TuxDriver01Test.cpp】

Platform BuilderはTux.DLLを新規にスケルトンコードとコメントを生成します。この時にShellProc関数を作ります。このShellProc関数はCETK実施時の通知、問い合わせ、テストモジュールの準備に関してTuxからのメッセージを受信します。すなわちTuxはこのShellProc関数を通じて、Tux.DLLとのやり取りを行うのです。この時、最低SPM_REGISTERだけが要求され、サポートされていないメッセージではSPR_NOT_HANDLEDを返します。

【ft.h】

CETKを実施する時は、実行するテストの番号を指定することができます。この番号と実施するテストすなわち関数のエントリポイントをここで定義します。実際の定義はTux機能テーブルに記述されます。Test.cppの部分で説明したように、このサンプルではTestProc1とTestPorc2の関数がテスト用として準備されています。

BEGIN_FTE
    FTH(0, "Sample test cases")
    FTE(1, "Sample test 1",  1, 0, TestProc1)
    FTE(1, "Sample test 2", 10, 0, TestProc2)
END_FTE

テストの実行ではこの機能テーブルに記述されている番号を元に、そのテスト用関数を呼び出すのです。テストを追加する場合には、このft.hに記述されているTux機能テーブルへの定義の追加と、Test.cppへの関数の追加を行います。

以上のようにユーザー定義のテストを追加する場合も、いくつかのポイントがわかれば比較的簡単に対応できます。

WinCE6.0 CETKの実施 - その2

前回の記事でとりあえずCETKの実行ができました。さて今回はCETKにユーザ定義のテストを追加し、実行するということをしてみます。

さて最初にテスト対象のドライバとテスト用Tuxを作成し組み込み、登録を行います。まずはいつものようにサンプルソースをダウンロードしてください。

ダウンロードしたファイルのうち、まずはDriver01_0707.zipを展開しサブプロジェクトとして前回作ったOSイメージに追加してください。TuxDriver01_0707.zipは後で使用しますので今は何もしません。サブプロジェクトへの追加は、PB6.0でOSイメージのワークスペースを開いた状態で、“ファイル:追加:既存のサブプロジェクト...”を選択し、対象のサブプロジェクトの.pbpxmlファイルを選択します。今回の例ではDriver01.pbpxmlです。サブプロジェクトを追加したら、“ビルド:詳細なビルドコマンド:現在のBSPおよびサブプロジェクトのビルド”を選択してOSイメージを作成してください。念のため、OSイメージを起動してDriver01.dllがロードされていることを確認してください。

さて次にこのDriver01.dllをCETKを使ってテストしてみたいと思います。OSイメージを起動している場合は、そのままでもオッケーです。ダウンロードして展開したTuxDriver01フォルダを適当な場所(例:C:\WINCE600\OSDesigns\TestDesigns01\TestDesigns01)にコピーします。“ファイル:追加:既存のサブプロジェクト...”からTuxDriver01.pbpxmlを選択し、このサブプロジェクトをビルドしてください。

次にCETKをターゲットデバイスと接続します。接続方法については前回の記事を参考にしてください。CETKとターゲットデバイスの接続が終了したら、先ほど作成したユーザ定義のテストTuxDriver01.dllをCETKに追加します。

まず最初にCETKのメニューから“テスト:ユーザー定義...”を選択すると、ユーザー定義テストウィザードが開きます。何も考えずに「次へ」をクリックしてください。

070701_01

今回は作成したテストを追加しますので、「新しいテストを追加する」を選択し「次へ」をクリックします。

070701_02

次の画面で追加テストを指定します。

070701_03
  • テストキット:デフォルトのままです。
  • テストの名前:ユーザーテストの名前を入力してください。例としてTuxDriver01となっています。
  • TUXモジュール(DLL):テスト用DLLのフルパスを指定します。例ではC:\WINCE600\OSDesigns\TestDesigns01\TestDesigns01\TuxDriver01\obj\ARMV4I\debug\TuxDriver01.dllとなっています。
  • コマンドライン:デフォルトのままです。
  • プロセッサ:今回はARMエミュレータを使用しますので、ARMV4Iを選択してください。

全ての入力が終わったら「次へ」をクリックします。

070701_04

そのままの設定で「次へ」をクリックします。

070701_05

設定した情報が表示されますので、内容を確認して「次へ」をクリックします。

070701_06

「完了」をクリックするとユーザテストの追加は終わりです。追加したテストはそのままではテストはできません。再度CETKに周辺機器を再検出させ、追加テストの検出を行います。下図のように「WindowsCE」を右クリックし、「周辺機器の再検出」を選択してください。

070701_07

再検出が終了し、「WindowsCE」を展開すると、User Testsに追加したTuxDriver01が表示されていることがわかります。これでユーザテストの追加ができました。

070701_08

この追加したユーザテストTuxDriver01を実行するとテストは失敗となります。次回以降はテストが失敗した原因を確認しながら、CETKへのテストの追加とCETKを用いた問題の解析について説明していきたいと思います。

続く...

【番外編】

TuxDriver01.dllのビルドでエラーが発生しました。調査してみると、C:\Program Files\Microsoft Platform Builder\6.00\cepb\wcetk\tux\inc\tux.hが壊れていました。とりあえず英語版PB6.0からコピーしてビルドを通しています。今回は日本語版PB6.0を使用しているため、もしかすると日本語版PB6.0固有の問題かもしれません。英語版PB6.0では全く問題はありませんでした。これから別の環境に日本語版PB6.0を再インストールして試してみようと思いますが、同じ現象の方はご連絡ください。バグレポートとしてマイクロソフトに上げたいと思います。

どうも日本語版PB6.0の動作があちこち怪しいような感じがします。ファイルが思ったようにできてくれないようなのですが、細かな検証ができていません。

【番外編+】

このtux.hですが、もう一度WinXP Proから新規インストールして確認してみました。その結果PB6.0日本語版をインストールした時点で壊れていることがわかりました。私がインストールしている日本語版が評価キットのためかもしれません。この事についてはマイクロソフトにレポートしてみます。

WinCE6.0 CETKの実施 - その1

それでは宣言どおり、CETKの話を始めたいと思います。最初にCETKはどういうアーキテクチャでという話をする前に、OSイメージにCETKを組み込んで実行してみたいと思います。なお今回の開発環境は以下の通りです。PB6.0日本語の評価キットを入れてみました。

  • Visual Studio 2005 Professional(日本語)+SP1
  • Platform Builder 6.0(日本語)+SP1

あらかじめ作成したOSイメージにCETKを追加するためには、カタログからCETKを追加します。カタログ項目ビューで“デバイスドライバ:Windows Embedded CEテストキット”にチェックを入れて追加してください。もしカタログ項目ビューがPBで見当たらない場合は、“表示:その他のウィンドウ:カタログ項目ビュー”メニューを選択すると表示されます。

070623_01

CETKを追加したら、“ビルド:ランタイムイメージの作成”を選択し、OSイメージを再構築します。CETKを組み込む場合は、ビルドフェイズのMakeimgだけでOSイメージを作ることができます。

OSイメージができたところで、いつものようにEmulatorで起動します。それからCETKを接続するのですが、実はPB6.0からはCETKはPBのメニューからは無くなっています(おそらくCETKはデバイステスト用の独立したツールだから分けたのだと思います)。そのためCETKはスタートメニューから“Windows Embedded CE 6.0:Windows Embedded CE 6.0 テスト キット”を選択してCETKを起動することになります。

070623_02

PB5.0までのCETKを使われていた方はご存知でしょうが、CETKは他のリモートツールとは異なり、起動するだけではターゲットデバイスに接続しません。“接続:クライアントの開始...”を選択することで初めて接続の画面が表示されます。

070623_03

後は“接続”ボタンをクリックしてターゲットデバイスと接続します。CETKはターゲットデバイスの周辺機器をチェックして、そのテスト開始の準備をします。またターゲットデバイスではClientSide.exeが起動してCETKの各テストを起動できるような待ち状態に入ります。

070623_04

070623_05

下の例では、“Serial Port:Serial Port Driver Test”を右クリックし、“クイックスタート”を選択するとシリアルポートのテストが始まります。

070623_06

テストが始まると、CETKの画面には[テストは進行中です]と表示されます。テストが終了すると、対象テストの右クリックメニューから“結果の表示”を選択してテスト結果を見ることができます。テスト結果では以下の情報を確認することができます。

  • テストサマリー:テスト全体の結果と各テストの結果を表示します。
  • 各テストのログ:各テストごとにその結果とログを表示します。テストによって出力されたログを確認することでエラーとなった際の原因を探ることができます。

070623_07

このようにテストを行うことで、簡単にデバイスドライバの動作検証を進めることができます。また出力されるログは、テスト結果の確認をするだけではなく、エラーの原因を探るために重要なデータとなるのです。

続く...

予告:今度はCETKです

セミナー・イベント月間が終わったら少しは暇になると思っていましたが、なぜか全然そうはなりません。なんででしょうかね?おかげさまで忙しい毎日なのですが、このブログもなかなか更新ができない状態です。

ということで自分に課題を与えるという意味で、今度はCETKについて短期連載を始めますというお知らせです。

CETKとはWindows CE Test Kitの略でデバイスドライバの自動テストツールです。その昔ASSP(ASAPではありません!)と呼ばれたCPU認証テストツールの拡張版です。マイクロソフトが準備してくれるテストハーネスとなっているため、標準のCETKの他、ユーザが自分で開発したテストを組み込む事も比較的簡単です。CETKを通せばオッケーというわけではないのですが、ドライバ開発者でない方が開発した(この場合はマイクロソフト)テストを通す事で、開発者自身が見逃していた仕様に関する点も容赦なくテストしてくれます。

またユーザによって追加されたテストは使い回しができますので、結局はテスト資産として開発者の財産となります。テストシステムをスクラッチから作るよりも、このCETKを利用した方がコストが下がるというのは自明です。

なお用語として Tux、Katoというものが出てきます。内容については追々説明する事になりますが、呼び方はそれぞれタックス、カトーと読んでください。特にKatoに関してアメリカ人はケイトーと発音しますが、これはカトーで間違いありません。なぜならばこのKatoはTVドラマ「グリーン・ホーネット」でブルース・リーが演じたカトーから取っているからです。

※以前、Katoについてスタートレックの「カトー隊長」から名付けたのでは?という説を私は唱えていました。しかし調べてみると日本で「カトー隊長」と呼ばれている登場人物はUSでは「ヒカル・スールー」という名前でした。従って、このスタートレック/カトー隊長説はもろくも崩れ去ったのでした。