ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Frameworkモバイル開発者ガイド
11g リリース2 (11.1.2.3.0)
B70750-01
  目次へ
目次

前
 
次
 

18 ADFモバイル・アプリケーションのテストとデバッグ

この章では、iOSとAndroidの両方のプラットフォーム用に開発されたADFモバイル・アプリケーションのテストとデバッグを行う方法について説明します。

この章では、次の項目について説明します。

18.1 ADFモバイル・アプリケーションのテストとデバッグの概要

ADFモバイル・アプリケーションのテストとデバッグを開始する前に、そのアプリケーションを次のいずれかにデプロイする必要があります。

ADFモバイル・アプリケーションは、デプロイしないと実行できません。詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

ADFモバイル・アプリケーションのテストとデバッグを行うには、通常、次の手順を実行します。

  1. スプラッシュ画面、アプリケーション機能のナビゲーション、認証、プリファレンスなど、アプリケーションのインフラストラクチャをテストして、うたわれているすべてのアプリケーション機能が使用可能であることを確認します。

  2. アプリケーションにADFモバイルAMXコンテンツが含まれている場合は、このアプリケーション機能のロジック、ページ・フロー、データ・コントロールおよびUIコンポーネントをテストします。

  3. 必要に応じてアプリケーションに変更を加えます。

  4. モバイル・デバイスを再接続するか、シミュレータを再起動し、さらなるテストおよびデバッグのためにアプリケーションをデプロイして実行します。

詳細は、次の項を参照してください。

18.2 ADFモバイル・アプリケーションのテスト

ADFモバイル・アプリケーションをテストするには、次の2つの方法があります。

  1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

  2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

18.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたADFモバイル・アプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

  • iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。

    詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Accessibility Programming Guide for iOS』の「Testing the Accessibility of Your iPhone Application」を参照してください。

  • iOSデバイス上でVoiceOverを使用してテストする。

    詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。

18.3 ADFモバイル・アプリケーションのデバッグ

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してOracle ADFアプリケーションの実行を監視および制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のアプリケーションのデバッグに関する項を参照してください。

ADFモバイル・アプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン(JVM) 1.4インスタンスに接続し、デプロイ済のADFモバイル・アプリケーションのJavaの部分を制御します。

JDeveloperを使用してADFモバイル・アプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

  1. リモート・デバッグ用のプロジェクト・プロパティを構成します。この手順では、次のようにADFモデルのデバッグ構成を作成します。

    1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。

    2. 「プロジェクト・プロパティ」ダイアログで、「実行/デバッグ/プロファイル」ノードを選択します。

    3. 「実行/デバッグ/プロファイル」ダイアログの「実行構成」ペインを使用して、新しい構成を作成するか、「編集」をクリックして既存の構成を変更します。

    4. 「実行構成の編集」→「起動設定」ダイアログで、「リモート・デバッグ」を選択します。

    5. 「実行構成の編集」ダイアログの「ツール設定」ノードを開き、「デバッガ」を開いて、「リモート」を選択します。

    6. 図18-1に示す「実行構成の編集」→「リモート」ダイアログで、次の構成を行います。

      - プロトコルを「JPDAにアタッチ」に設定します。

      - ホストを次のいずれかに設定します。1) シミュレータまたはエミュレータでのデバッグの場合は、localhostに設定します。2) デバイスでのデバッグの場合は、開発コンピュータからネットワーク経由でそのデバイスにアクセスできることを確認し(pingコマンドを使用してネットワーク・アクセスをテストできます)、デバイスのIPアドレスを入力します。

      - ポートを適切なポート番号に設定します。

      - タイムアウトを2に設定します。

      図18-1 リモート・デバッグの構成

      「JPDAにアタッチ」を選択します。
  2. モバイル・デバイスまたはシミュレータにアプリケーションをデプロイします(第18.3.1項「iOSプラットフォームでのデバッグ方法」または第18.3.2項「Androidプラットフォームでのデバッグ方法」を参照)。

  3. cvm.propertiesファイルで次のデバッグ・パラメータを指定します。

    java.debug.enabled=true
    java.debug.port=4000
    

    ポート番号は、JDeveloperで設定したものと一致している必要があります。

    詳細は、第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

  4. アプリケーションをモバイル・デバイスまたはシミュレータに再デプロイします。

  5. アプリケーション・アイコンをクリックして、モバイル・デバイスまたはシミュレータでアプリケーションを起動します。

  6. 次のようにして、JDeveloperからデバッガを起動します。

    1. JDeveloperのメイン・メニューのデバッグ・アイコンを使用して、実行構成(手順3でこのプロジェクトに対して定義したもの)を選択します。

    2. デバッガのJPDAデバッガにアタッチダイアログを確認します。


注意:

タイムアウト(20秒)を回避するには、モバイル・デバイスまたはシミュレータ上でアプリケーションを起動したら、ただちにデバッガを起動します。


デバッグでモバイル・デバイスを使用する場合は、WiFiを介して接続する必要があります。

詳細は、次を参照してください。

18.3.1 iOSプラットフォームでのデバッグ方法

iOSプラットフォームでJDeveloperを使用してADFモバイル・アプリケーションをデバッグするには、第18.3項「ADFモバイル・アプリケーションのデバッグ」で説明されている一般的なデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのADFモバイル・アプリケーションのデプロイ方法については、次を参照してください。

18.3.2 Androidプラットフォームでのデバッグ方法

AndroidプラットフォームでJDeveloperを使用してADFモバイル・アプリケーションをデバッグするには、第18.3項「ADFモバイル・アプリケーションのデバッグ」で説明されている一般的なデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのADFモバイル・アプリケーションのデプロイ方法については、第16.3.1項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

USBを介して接続されたAndroidデバイス上で、またはAndroidデバイス・エミュレータ上でJavaコードをデバッグする場合、端末で次のコマンドを実行することでTCPポートをフォワードする必要があります。

  • デバイスでのデバッグの場合:

    adb -d forward tcp:<host port> tcp:<target port>

  • エミュレータでのデバッグの場合:

    adb -e forward tcp:<host port> tcp:<target port>

たとえば、adb -d forward tcp:4510 tcp:4510を実行すると、デバイスのTCPポート4510がホストのTCPポート4510にフォワードされます。実行時、cvm.propertiesファイルのデバッグ設定(第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)は、次のように定義する必要があります。

java.debug.enabled=true

java.debug.port=4510


注意:

接続がWi-Fiを介して行われる場合は、この接続が正しいことを確認してください。デバッガとターゲットの両方を、仮想プライベート・ネットワーク(VPN)を使用せずに、同じネットワーク上に配置することをお薦めします。


18.3.3 ADFモバイルAMXコンテンツのデバッグ方法

ADFモバイル・アプリケーションにADFモバイルAMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、WebベースのADF Facesアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFコンポーネントのテストとデバッグに関する項を参照してください。


注意:

デバッグできるのは、JavaコードおよびJavaScriptのみです(第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。


18.3.4 JavaコードおよびJavaScriptのデバッグを有効にする方法

cvm.propertiesファイルでは、JVMの起動パラメータおよびADFモバイルのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。cvm.propertiesファイルは、自動的に作成され、プロジェクトのDescriptors/META-INFディレクトリに配置されます(第18.5項「ロギングの使用方法と構成」を参照)。

cvm.propertiesファイルで次のデバッグ・プロパティを使用できます。

  • java.debug.enabled: ADFモバイルでのJavaのデバッグを有効または無効にします。有効な値は、truefalseです。


    注意:

    java.debug.enabledtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、ADFモバイルAMXアプリケーション機能のロードが失敗します。


  • java.debug.port: デバッグ時に使用するポートを指定します。有効値は整数です。

  • javascript.debug.enabled: アプリケーションがデバイス・シミュレータで実行されている場合、JavaScriptのデバッグを有効または無効にします。有効な値は、truefalseです。

  • javascript.debug.feature: ADFモバイルでのJavaScriptのデバッグの有効化をトリガーするアプリケーション機能を指定します。この値の形式はfeatureId:portです。ポートを指定する必要があります(これは当初、プレースホルダ値に設定されています)。

cvm.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000
javascript.debug.enabled=true
javascript.debug.feature=products:8888

cvm.propertiesファイルがJavaScriptをデバッグするように構成されたら、次のURLに異動して、ADFモバイルでデバッグ可能なすべてのロード済ページのリストを確認できます。

http://localhost:9999


注意:

iOSデバイス・シミュレータの複数のインスタンスによって共有されているコンピュータ上でJavaScriptをデバッグすると、問題が発生することがあります。iOSデバイス・シミュレータの複数のインスタンスが実行されている場合、特定のインスタンスに接続することはできない可能性があるため、デバッグ・ページを表示できません。


JDeveloperを使用してJavaコードをデバッグする方法については、第18.3項「ADFモバイル・アプリケーションのデバッグ」を参照してください。

18.4 デバッグ・モードの使用方法

アプリケーションのデプロイメント・プロファイルを使用して、ADFモバイル・アプリケーションの実行モードをリリースまたはデバッグのいずれかに指定します。デバッグ・モードでは、コンパイル時に特殊なデバッグ・ライブラリおよびシンボルを含めることが可能です。

図18-2は、Android上のデバッグ・モード・オプションの設定方法を示しています。

図18-2 Android用のデバッグ・モードの設定

Android用のデバッグ・モードの設定

図18-3は、iOS上のデバッグ・モード・オプションの設定方法を示しています。

図18-3 iOS用のデバッグ・モードの設定

iOS用のデバッグ・モードの設定

詳細は、次の項を参照してください。

18.5 ロギングの使用方法と構成

ADFモバイル・アプリケーションでは、JavaScriptと埋込みコードによって、AndroidおよびiOSプラットフォームでのロギングを有効にできます。これにはすべて単一の構成が使用され、System.out.printlnおよびSystem.err.println文によって生成される出力を含め、ログ出力は単一のファイルにまとめられます。

デフォルトのADFモバイルのロギング・プロセスは、次のとおりです。

ADFモバイルのログ出力は、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。

public static final String APP_LOGNAME = "oracle.adfmf.application";
public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME);

public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework";
public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);

ADFモバイル・アプリケーションで使用するログ出力は、ApplicationLoggerです。

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

18.5.1 プロパティ・ファイルを使用したロギングの構成方法

例18-1は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

例18-1 logging.propertiesファイル

# default - all loggers to use the ConsoleHandler
.handlers=com.sun.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=com.sun.util.logging.SimpleFormatter

oracle.adfmf.util.logging.ConsoleHandler.formatter=
             oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=
             [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

#configure the framework logger to only use the adfmf ConsoleHandler
oracle.adfmf.framework.useParentHandlers=false
oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.framework.level=SEVERE

#configure the application logger to only use the adfmf ConsoleHandler
oracle.adfmf.application.useParentHandlers=false
oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.application.level=SEVERE

oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。

oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。

  • %LEVEL%: ロギング・レベル。

  • %LOGGER%: 出力が書き込まれるログ出力の名前。

  • %CLASS%: ログに記録されるクラス。

  • %METHOD%: ログに記録されるメソッド。

  • %TIME%: ロギング・メッセージが送信された時間。

  • %MESSAGE%: 実際のメッセージ。

使用可能なロギング・レベルは、次のとおりです。

  • SEVERE: 重大な障害を示すメッセージ・レベルです。

  • WARNING: 潜在的な問題を示すメッセージ・レベルです。

  • INFO: 情報メッセージのメッセージ・レベルです。

  • FINE: トレース情報を提供するメッセージ・レベルです。

  • FINER: このレベルは、かなり詳細なトレース・メッセージを示します。

  • FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。


注意:

ロギング・レベルの詳細度を選択するときは、SEVEREWARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。


logging.propertiesファイルで定義されているログ出力は、oracle.adfmf.util.Utilityクラスから取得されるログ出力と一致します(第18.5項「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、例18-2に示されているものと同じレベルに変更する必要があります。

例18-2 非常に詳細なロギング・レベルの設定

oracle.adfmf.util.logging.ConsoleHandler.formatter=
             oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.ConsoleHandler.level=FINEST
oracle.adfmf.util.logging.PatternFormatter.pattern=
             [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

18.5.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
   function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationログ出力を使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

  • adf.mf.log.level.SEVERE

  • adf.mf.log.level.WARNING

  • adf.mf.log.level.INFO

  • adf.mf.log.level.CONFIG

  • adf.mf.log.level.FINE

  • adf.mf.log.level.FINER

  • adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationログ出力のlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

  • ロギング・レベル

  • 文字列としての現在のクラス名

  • 文字列としての現在のメソッド

  • 文字列としてのメッセージ文字列

例18-3は、ADFモバイル・アプリケーションでのlogpメソッドの使用方法を示しています。

例18-3 ロギング・メソッドの使用方法

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
                            "myClass",
                            "myMethod",
                            "My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

18.5.3 埋込みロギングの使用方法

埋込みロギングでは、例18-4に示されているとおり、com.sun.util.logging.Loggerを使用します。

例18-4 埋込みロギングの使用方法

import com.sun.util.logging.Level;
import com.sun.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
   Utility.ApplicationLogger.logp(Level.WARNING, 
                                  EmbeddedClass.class.getName(),
                                  "onTestMessage",
                                  "embedded warning message 1");
   Logger.getLogger(Utility.APPLICATION_LOGNAME).logp(Level.WARNING,
                                                 this.getClass().getName(),
                                                 "onTestMessage",
                                                 "embedded warning message 2");
   Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
                                                this.getClass().getName(),
                                                "onTestMessage",
                                                "embedded warning message 3");

このコードによって生成される出力は、次のとおりです。

[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3