2010年7月11日日曜日

Testing

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/7/7(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/July/7 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


テスト

中身

要件

テストの必要性

  • 動作(specs)
  • パフォーマンス速度(profile)
  • メモリ消費 - allocation/de-allocation/leak
  • ストレスと境界条件
  • 継続的なテストサポート

テストを必要とする機能範囲

  • sync engine
  • DB
  • ローカルhttpサーバ
  • プラットフォームグルー
  • プラットフォーム固有のAPI
  • Web表示(それをテストする必要があるか?)
  • Ruby(VMとextension) - rubiniusのspecを使う
  • rho フレームワーク
  • rhom
  • アプリケーション

以下の言語でコードをテストする必要性

  • C / C + +
  • Objective - C
  • java
  • ruby
  • JavaScriptのコード(オプション?)

テスト環境

  • Windows
  • Mac
  • デバイス上の組み込み(およびエミュレータ)

実装

  • httpローカルサーバー、ルビー(VMとextensions)、rhoフレームワーク, rhom, アプリケーションのテストには:
    • PC上でテストできるように、Win32シミュレータ開発。
    • Mac上でテストするために、OSXのシミュレータ開発。
    • Linux開発でテストするために、GTKもしくは同様なシミュレータ開発。
    • specフレームワークは、次から構成されます:
      • rhodesアプリケーション内でspecファイルを実行するEmbedded MSpec runner。
      • 定義しているincludeとexcludedディレクトリのrubyクラス、個々のspecファイルとログオプション。
      • 進行中の結果のgranularログ。
      • htmlで表示される結果を収集するためのRubyインターフェイス。
    • コアspec - Ruby実装のテストを行うrubinius specを実行。
    • コアspec - rho, rhomをテストするspecのセットを開発
    • in-controller spec - アプリケーション開発者向けのspecを開発
  • 我々がsync engineをリファクタリングしたように、Googleのテストフレームワークを使用してユニットテストを開発

参照

Googleのテスト

Googleのモック

RSpec

mspec(ruby言語機能の実行のための(ミニマル rspecのクローン)

Rubinius

cppSpec

jSpec

vgrind

その他

単体テストフレームワークの巨大なリスト

ログとレポート

  • プラットフォーム間で共通のレポートAPIを提供
  • レポートおよびコードカバレッジのための一般的なUIを提供する

要件

サポートのためのログ/レポート

  • プラットフォームの開発
  • アプリケーションの開発
  • エンドユーザーのサポート(クラッシュ/問題のロギングおよびレポート)
  • 統計情報の収集と報告の簡易アプリケーション

ログレポート機能

レベル別のレポート:

  • デバッグとリリースモード。コンパイル時および実行時の定義。
  • 重大度レベル - fatalエラー、エラー、warning、info。コンパイル時および実行時の定義。
  • 詳細ログ - 追加情報のレベル。
  • 名前付きメッセージグループ。各クラスは、自分のメッセージグループを作成することができます。実行時にメッセージのグループを有効\無効にする。
  • 条件付きロギング。
  • 条件付きスタックトレースロギング。

簡単な書式でコンパクトな構文:

  • オプション情報 - メッセージ番号、日付/タイムスタンプ、ソースファイルの場所、スレッドIDなど
  • ヘッダ - 初期化時に出力し、プラットフォーム、OSのバージョン、現在の時刻などを含む情報
  • メッセージの自動インデント。ネストまたは再帰呼び出しで便利。

ロギング/レポートは以下の出力をサポートする必要があります:

  • 標準
  • FIFOファイルまたは限られたサイズのメモリバッファ
  • コンソールデバッグ埋め込み
  • リクエストによるログサーバへのログ出力を送信

オプションと設定

  • 実行時にメソッドの呼び出しによって行うログオプション設定
  • ロギング/レポートは設定ファイルを介して起動時に設定できる
  • コンパイル時に未使用のログ/レポートのコードを削除する。
  • 重大度レベルのよって、コンパイル時にログメッセージを取り除く
  • 巡回ログ:最大ログサイズをセット。もそらくクラッシュをキャッチを試みるときに有用である。

Logging APIは、クロスプラットフォームである必要があります。(????すべてのプラットフォーム固有の機能は、インターフェイスへ投げる)

実装

デバイス上のログの表示

このコマンドは、ログおよびログオプションをプラットフォーム依存ウィンドウに表示します:

 Rho::RhoConfig.show_log

ログをデバイスから送信

このコマンドは、サーバーにログを送信する:

Rho::RhoConfig.send_log

rhoconfig.txt設定:

 logserver = 'http://logserver.staging.rhohub.com/log_handler' #optional; if not set - syncserver will be used
logname = <any string> #optional; will use as prefix of the file on server side

ログのパラメータ送信とアクション:ログサーバを実装するにはサーバコントローラー(rhosyncか何か)にアクションを追加します - client_log
例:

http://logserver.staging.rhohub.com/log_handler/client_log?client_id=d4d14463-aeba-4097-b178-57a96bf28380&device_pin=&log_name=geny

もしクライアントがログインして、認証クッキーが送信されるなら、サーバは要求を認証できます、

ログをサーバー上で見る

http://logserver.staging.rhohub.com/log_handlerに移動して、ログファイルを選択します。

ログの設定ファイル

  • rhoconfig.txtのconfigファイルに設定します
  • フィールド...
 MinSeverity  = 1  
LogToOutput=1
LogToFile=1
LogFilePath=RhoLog.txt
MaxLogFileSize=20
LogPrefix=1
LogCategories=MyClass1,MyClass2
ExcludeLogCategories=MyClass3

C++

  • platform\shared\loggingフォルダに置きます
  • testを見てください: platform\shared\logging\test\TestLog.cpp
  • メインヘッダ logging\ RhoLog.h
  • ストリームベースのログの構文:
 LOG(INFO) + "Found " + num_cookies + " cookies";
LOG(INFO) + "Hex: " + LOGFMT("%X") + 10 + "; Dec: " + 10;

  • クラス内にメッセージグループを作成
 class CLogTest{
DEFINE_LOGCLASS;
public:
CLogTest(){
LOG(INFO)+"Constructor called.";
}
};
IMPLEMENT_LOGCLASS(CLogTest,"CLogTest");
  • STLライブラリが利用できます。SymbianはSDKにstl_portが含まれます。 GoogleTestはSTLを使い、これらはSymbianをサポートします。

C

  • logging\RhoPlainLog.hを使います
  • testを参照します:platform\shared\logging\test\TestPlainLog.c
  • マクロベースの構文:
   RAWLOG_INFO("RAW: Info 1");
RAWLOG_INFO1("RAW: Info %d", 55);
RAWLOG_INFO2("RAW: Info %d:%d", 55, 66);

RhoFramework

  • 通常のputを使います
  • 構文
 puts 'RHO loaded'
puts 'Cannot initialize'
puts 'Exception while creating object'


リンク

http://www.codeproject.com/KB/debug/log.aspxhttp://google-glog.googlecode.com/svn/trunk/doc/glog.htmlhttp://pantheios.sourceforge.net/http://log4cpp.sourceforge.net/http://log4cplus.sourceforge.net/http://logging.apache.org/log4cxx/

Java/J2ME

リンク

http://code.google.com/p/gwt-log/http://microlog.sourceforge.net/snapshot/http://sourceforge.net/projects/momelog~~Vhttp://jadabs.berlios.de/jadabs-cldc/multiproject/log4j-j2me/index.htmlhttp://www.mobilelandscape.uklinux.net/j2medownload/MIDPLogger.phphttp://sourceforge.net/projects/emobuslogmehttp://logging.apache.org/log4j/

性能テスト

クライアントのDB

  • 10,000件のレコードを特別なsync sourceで作成します
  • アプリケーションを作成しtestをデバイス上でテストします
  • 同期時間を測定します
  • firstname、lastnameなどのユーザフィールド使ってquery時間を測定します。改ページをエミュレートするためにlimitやoffsetを使います

ブロブテスト

  • 1日にファイルとしてblobを保存するsync serverを作成します
  • サーバーへ写真をpushするため、camera textを変更します。

プロファイル

要件

  • ログライブラリをベースに
  • ローカルの名前付きのカウンタ:start\stop
  • グローバル累積カウンタ:create\start\stop\flush\close
  • プラットフォームに依存しないタイムライブラリを使用
  • マイクロ秒、ミリ秒、秒、分の時間の表現:1 sec 20 millisec

実装

C / C + +

  • テストケースはをshared\statistic\test\TestProfiling.cppを参照してください
  • マクロの構文:
   PROF_START(LocalCounter1);
Sleep(2126);
PROF_STOP(LocalCounter1);

   PROF_CREATE_COUNTER(GlobalCounter2);
PROF_START(GlobalCounter2);
Sleep(1234);
PROF_STOP(GlobalCounter2);
PROF_FLUSH_COUNTER(GlobalCounter2,"Step1");
PROF_START(GlobalCounter2);
Sleep(1234);
PROF_STOP(GlobalCounter2);
   PROF_DESTROY_COUNTER(GlobalCounter2);
  int Func1(){
Sleep(500);
return 1;
}
void testProfCall(){
int n = 0;
PROF_CALL(n = Func1());
}
  • PROF_STOP ローカルカウンタの時間を記録します
  • PROF_DESTROY_COUNTERとPROF_FLUSH_COUNTERはグロバルカウンタの時刻を記録します

Java/J2ME

コメント/質問

ここに追加する考えなどをとおしてコメントを残します。

そこには何かのタイムラインまたはこれらのすべてのテスト項目が解決される順序があるか?

Resourcesこれらのタスクおよびテストを担当するのは誰?誰か採用が必要とされるか?

プラットフォームのためのテストプラン?

その他の項目:

私見では、rhosyncの継続的インテグレーションサーバ。http://cruisecontrolrb.thoughtworks.com/を参照 。前提条件:test suite。

バックエンドからデバイスまで、完全に端から端までsyncロジックをテストするいくつかの方法ある。現在、我々はこれを手動でテストします。

どのようにRhodesはプラットフォームとして異なるデバイス上でテストされるでしょうか。例えば、BBの8300、8310、8900、9000、9530、などなど、このためのよい解決策がありませんか、それは非常に時間がかかり、高価で....何かアイデアは?

ポリシーの質問。

コードカバレッジ。これは単純にもかかわらず、不完全なメトリックです。我々は、特定の%の目標をテストでカバー設定しますか??

将来において、テスト・ツールができたら、テストなしのコードでチェックするのはOKか?一部のオープンソースプロジェクトはポリシーとしてこれを許可していない。



1 件のコメント:

Arul shaji さんのコメント...

Great article! thanks a lot for sharing this useful info with us.