(57)【要約】【課題】  本発明は属性を介して制御することのできるテストケース継承の振る舞いを対象とする。【解決手段】  テストオブジェクトがそこから派生される基本テストクラスは、テストケースコードおよび管理を低減するのに役立つ。例えば、基本テストクラスおよびその派生されたオブジェクトを用いて、クラスの全セットで共通のステップ（テストされるべきソフトウェアの断片を起動し、それを特定の段階に至らせるなど）を実装することができる。継承の原理は、例えば基本クラスが変更されるとき、テストソフトウェアの管理を簡単化し、そのテストケースから派生するテストのすべてが自動的に変更される。したがって、ソフトウェアが起動する仕方を変更するために変更が必要なときに、（あらゆるテストではなく）１つの項目だけを変更すればよい。【選択図】  図２
2005293578.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ実行可能コンポーネントを有するコンピュータ可読媒体であって、
電子システムをテストするように構成されたテストメソッドを備えたテストケースシナリオオブジェクトであって、前記テストメソッドは基本クラスおよびサブクラスを備えた階層として構成され、前記サブクラスのそれぞれは前記基本クラスから派生し、継承の原理が前記階層内のメソッドの構成に従って各テストメソッドに適用されるテストケースシナリオオブジェクトと、
前記テストメソッドにシステムテストサービスを提供するように構成されたテストハーネスと
を備えたことを特徴とするコンピュータ可読媒体。
【請求項２】
前記継承の原理は、サブクラステストメソッドに選択的に適用されることを特徴とする請求項１に記載のコンピュータ可読媒体。
【請求項３】
前記サブクラステストメソッドは、前記継承の原理を適用するかどうかを判定するように構成された属性を備えたことを特徴とする請求項１に記載のコンピュータ可読媒体。
【請求項４】
前記テストメソッドを前記階層に従って順序付けるように構成されたテスト抽出エンジンをさらに備えたことを特徴とする請求項１に記載のコンピュータ可読媒体。
【請求項５】
前記テスト抽出エンジンは、前記属性内で定義された比較関数を用いて前記階層に従って前記テストメソッドを順序付けるように構成されたことを特徴とする請求項４に記載のコンピュータ可読媒体。
【請求項６】
前記基本クラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項１に記載のコンピュータ可読媒体。
【請求項７】
前記サブクラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項６に記載のコンピュータ可読媒体。
【請求項８】
自動化されたテストのための方法であって、
電子システムをテストするように構成されるテストメソッドを提供することと、
前記提供されたテストメソッドを、基本クラスおよびサブクラスを備える階層として構成することであって、前記サブクラスのそれぞれが前記基本クラスから派生することと、
前記階層内のメソッドの構成に従って各テストメソッドに継承の原理を適用することと、
テストハーネスを用いて前記テストメソッドにシステムテストサービスを提供することと
を備えることを特徴とする方法。
【請求項９】
前記継承の原理は、サブクラステストメソッドに選択的に適用されることを特徴とする請求項８に記載の方法。
【請求項１０】
前記継承の原理をサブクラステストメソッドの属性の状態に従って適用するかどうかを判定することをさらに備えることを特徴とする請求項８に記載の方法。
【請求項１１】
前記テストメソッドを前記階層に従って順序付けることをさらに備えることを特徴とする請求項８に記載の方法。
【請求項１２】
前記属性内で定義される比較関数を用いて前記テストメソッドを前記階層に従って順序付けることをさらに備えることを特徴とする請求項１１に記載の方法。
【請求項１３】
前記基本クラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えることを特徴とする請求項８に記載の方法。
【請求項１４】
前記サブクラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えることを特徴とする請求項１３に記載の方法。
【請求項１５】
テスト自動化システムであって、
電子システムをテストするように構成されたテストメソッドを備えたテストケースシナリオオブジェクトであって、前記テストメソッドは基本クラスおよびサブクラスを備えた階層として構成され、前記サブクラスのそれぞれは前記基本クラスから派生し、継承の原理が前記階層内のメソッドの構成に従って各テストメソッドに適用されたテストケースシナリオオブジェクトと、
前記テストメソッドにシステムテストサービスを提供するように構成されたテストハーネスと
を備えたことを特徴とするシステム。
【請求項１６】
前記継承の原理は、サブクラステストメソッドに選択的に適用されることを特徴とする請求項１５に記載のシステム。
【請求項１７】
前記サブクラステストメソッドは、前記継承の原理を適用するかどうかを判定するように構成された属性を備えたことを特徴とする請求項１５に記載のシステム。
【請求項１８】
前記テストメソッドを前記階層に従って順序付けるように構成されたテスト抽出エンジンをさらに備えたことを特徴とする請求項１５に記載のシステム。
【請求項１９】
前記テスト抽出エンジンは、前記属性内で定義された比較関数を用いて前記テストメソッドを前記階層に従って順序付けるように構成されたことを特徴とする請求項１８に記載のシステム。
【請求項２０】
前記基本クラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項１５に記載のシステム。
【請求項２１】
前記サブクラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項１５に記載のシステム。
【請求項２２】
テスト自動化システムであって、
電子システムをテストするように構成されたテストメソッドを提供するための手段と、
前記提供されたテストメソッドを、基本クラスおよびサブクラスを備えた階層として構成するための手段であって、前記サブクラスのそれぞれが前記基本クラスから派生する手段と、
継承の原理を前記階層内のメソッドの構成に従って各テストメソッドに適用するための手段と、
テストハーネス手段を用いて前記テストメソッドにシステムテストサービスを提供することと
を備えたことを特徴とするシステム。
【請求項２３】
前記継承の原理は、サブクラステストメソッドに選択的に適用されることを特徴とする請求項２２に記載のシステム。
【請求項２４】
前記継承の原理をサブクラステストメソッドの属性の状態に従って適用するかどうかを判定するための手段をさらに備えたことを特徴とする請求項２２に記載のシステム。
【請求項２５】
前記テストメソッドを前記階層に従って順序付けるための手段をさらに備えたことを特徴とする請求項２２に記載のシステム。
【請求項２６】
前記階層内で定義された比較関数を用いて前記テストメソッドを前記階層に従って順序付けるための手段をさらに備えたことを特徴とする請求項２５に記載のシステム。
【請求項２７】
前記基本クラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項２２に記載のシステム。
【請求項２８】
前記サブクラステストメソッドは、セットアップメソッドおよびティアダウンメソッドを備えたことを特徴とする請求項２７に記載のシステム。
【請求項２９】
サブクラステストメソッドの状態を前記サブクラステストメソッドによって継承された属性に応答して変更するための手段をさらに備えたことを特徴とする請求項２２に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、属性を介して制御されるテストケースの継承に関する。
【背景技術】
【０００２】
テスト自動化システムは、ソフトウェア駆動のシステムを自動的にテストするのに使用される。従来のアーキテクチャはテストハーネスを使用し、テストハーネスは、通常、属性によって指定されたテストケースを含む、テストケースの実行に使用される。属性を使用する自動化テストは、普通、テストハーネスによってそのテストを実行するためにコールされるいくつかのメソッドを有する単一のクラスからなる。従来のアーキテクチャによるテストは他のクラスからテストメソッドを継承せず、これにより共通の基本テストクラスの作成を妨げている。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
従来のテストハーネスは、クラスおよび／またはメソッドのそれぞれを検査し、存在する属性を検査し、次いで属性の検査に基づいてアクションを行う。属性を使用するこの方法は、アクションを行うために必要なコードがテストハーネス中に存在することを必要とする。したがって、テストハーネスを変更することなく新しい種類のテスト属性を作成することはできない。しかも、同じコードを、多くの場合、そのコードが使用される異なるテストハーネスごとに書く（または変更する）必要がある。従来のテストハーネスにおける多様な機能は、１つのテストが各テストハーネスで異なって実行され得るように、テストハーネス間の差異（あるいは１つのテストハーネスでのみ適正に実行されるテスト）をもたらす結果になることがあり、望ましくない。
【０００４】
本発明によれば、属性は、異なるテストハーネスを用いて書かれたテストを実行するために変更を必要とすることなく再使用することができる。
【課題を解決するための手段】
【０００５】
本発明は、属性を介して制御することのできるテストケース継承の振る舞いを対象とする。テストオブジェクトがそこから派生される基本テストクラスは、テストケースコードおよび管理を低減するのに役立つ。例えば、基本テストクラスおよびその派生されたオブジェクトを用いて、テストクラスの全セットで共通のステップ（テストされるべきソフトウェアを起動し、それを特定の段階に至らせるなど）を実施することができる。継承の原理は、例えば基本クラスが変更されるときに、テストソフトウェアの管理を簡単化する。基本クラスが変更されると、その基本クラスから派生するテストクラスのすべてが自動的に変更される。したがって、例えばソフトウェアが起動する仕方を変更するために変更が必要なときには、（あらゆるテストではなく）１つの項目だけを変更すればよい。
【０００６】
本発明の一態様によれば、コンピュータ実行可能コンポーネントを有するコンピュータ可読媒体が２つのコンポーネントを備える。テストケースシナリオオブジェクトは電子システムをテストするように構成されたテストメソッドを備え、テストメソッドは基本クラスおよびサブクラスを備えた階層として構成され、サブクラスのそれぞれは基本クラスから派生し、継承の原理は階層内のメソッドの構成に従って各テストメソッドに適用される。テストハーネスはそれらのテストメソッドにシステムテストサービスを提供するように構成される。
【０００７】
本発明の別の態様によれば、テストコンポーネントを実行するための方法が電子システムをテストするように構成されるテストメソッドを提供することを備える。提供されるテストメソッドは、基本クラスおよびサブクラスを備える階層として構成され、サブクラスのそれぞれは基本クラスから派生する。継承の原理は階層内のメソッドの構成に従って各テストメソッドに適用される。テストハーネスはそれらのテストメソッドにシステムテストサービスを提供するために使用される。
【０００８】
本発明の別の態様によれば、自動化テストのためのシステムが２つのコンポーネントを備える。テストケースシナリオオブジェクトは電子システムをテストするように構成されたテストメソッドを備え、テストメソッドは基本クラスおよびサブクラスを備えた階層として構成され、サブクラスのそれぞれは基本クラスから派生し、継承の原理は階層内のメソッドの構成に従って各テストメソッドに適用される。テストハーネスはそれらのテストメソッドにシステムテストサービスを提供するように構成される。
【０００９】
本発明の別の態様によれば、自動化テストのためのシステムが電子システムをテストするように構成されたテストメソッドを提供するための手段と、提供されたテストメソッドを、基本クラスおよびサブクラスを備えた階層として構成するための手段であって、サブクラスのそれぞれが基本クラスから派生する手段と、階層内のメソッドの構成に従って各テストメソッドに継承の原理を適用するための手段と、テストハーネス手段を使用してテストメソッドにシステムテストサービスを提供することとを備える。
【発明を実施するための最良の形態】
【００１０】
本明細書および特許請求の範囲を通じて、以下の用語は、文脈が明らかに別の意味を指示しない限り、ここで明示的に関連付けられた意味を有する。本明細書で使用する用語およびインターフェース仕様は、特定のオブジェクトまたはメソッドが記述されるべき特定の言語を代表するものではない。そうではなく、これらの用語およびインターフェース仕様は、関数名、入力、出力、戻り値、そのインターフェースを用いてどんな操作が行われるか（あるいはそのオブジェクトによってどんな操作が行われるか）といった、インターフェースまたはオブジェクトの機能および内容を説明するために使用される。
【００１１】
（例示的な動作環境）
図１を参照すると、本発明を実施するための例示的な一実施形態がコンピューティングデバイス１００などのコンピューティングデバイスを含んでいる。非常に基本的な構成では、コンピューティングデバイス１００は、通常、少なくとも１つの処理ユニット１０２とシステムメモリ１０４を含む。コンピューティングデバイスの厳密な構成および種類に応じて、システムメモリ１０４は、揮発性（ＲＡＭなど）、不揮発性（ＲＯＭやフラッシュメモリなど）、またはこれら２つの何らかの組み合わせとすることもできる。システムメモリ１０４は、通常、オペレーティングシステム１０５、１つまたは複数のアプリケーション１０６を含み、プログラムデータ１０７を含むことがある。一実施形態では、アプリケーション１０６は、ＭＬエディタ１２２をさらに含むワードプロセッサアプリケーション１２０を含むことがある。この基本構成を、図１に破線１０８内の構成要素で示す。
【００１２】
コンピューティングデバイス１００は追加の特徴または機能を有することもある。例えば、コンピューティングデバイス１００は、例えば、磁気ディスク、光ディスクまたはテープなど、（リムーバブルおよび／または非リムーバブルの）追加のデータストレージデバイスを含むこともある。そのような追加のストレージを、図１にリムーバブルストレージ１０９および非リムーバブルストレージ１１０で示す。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、その他のデータなどの情報のストレージのための任意の方法または技術で実装された揮発性および不揮発性、リムーバブルおよび非リムーバブルの媒体が含まれ得る。システムメモリ１０４、リムーバブルストレージ１０９および非リムーバブルストレージ１１０は、すべてコンピュータ記憶媒体の例である。コンピュータ記憶媒体には、これらに限らないが、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリなどのメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）などの光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージなどの磁気ストレージデバイス、または所望の情報を格納するのに使用することができ、コンピューティングデバイス１００によってアクセスすることのできる他の任意の媒体が含まれる。任意のそのようなコンピュータ記憶媒体をデバイス１００の一部とすることができる。コンピューティングデバイス１００は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイスなどの入力デバイス１１２を有することもできる。ディスプレイ、スピーカ、プリンタなどの出力デバイス１１４を含むこともできる。これらのデバイスは当分野で周知であり、ここで詳細に論じる必要はない。
【００１３】
コンピューティングデバイス１００は、このデバイスが、ネットワークなどを介して他のコンピューティングデバイス１１８と通信できるようにする通信接続１１６を含むこともある。通信接続１１６は、通信媒体の一例である。通信媒体は、通常、搬送波や他のトランスポート機構などの変調されたデータ信号にコンピュータ可読命令、データ構造、プログラムモジュールまたはその他のデータによって具体化することができ、任意の情報配信媒体を含む。「変調されたデータ信号」という用語は、信号に情報を符号化するようにその特性の１つまたは複数を設定または変更した信号を意味する。例をあげると、限定ではなく、通信媒体には有線ネットワークや直接配線接続などの有線媒体、および音響、ＲＦ、赤外線、その他の無線媒体などの無線媒体が含まれる。本明細書で使用するコンピュータ可読媒体という用語は、記憶媒体と通信媒体の両方を含む。
【００１４】
本発明は、属性を介して制御することのできるテストケース継承の振る舞いを対象とする。テストオブジェクトがそこから派生される基本テストクラスは、テストケースコードおよび管理を低減するのに役立つ。例えば、基本テストクラスおよびその派生オブジェクトを用いて、テストクラスの全セットで共通のステップ（テストされるべきソフトウェアを起動し、それを特定の段階に至らせるなど）を実施することができる。継承の原理は、例えば基本クラスが変更されるときに、テストソフトウェアの管理を簡単化する。基本クラスが変更されると、その基本クラスから派生するテストクラスのすべてが自動的に変更される。したがって、例えばソフトウェアが起動する仕方を変更するために変更が必要なときに、（あらゆるテストではなく）１つの項目だけを変更すればよい。以下で論じるように、選択的継承を使用して、テストが継承されたメソッドを用いた適正に実行されるようにすることができる。
【００１５】
継承は非常に有用ではあるが、継承を基本テストクラスから派生したすべてのメソッドに義務付ける必要はない。本発明によれば、継承を適用すべきかどうかを属性が選択する機構が提供される。（属性を介して制御することのできる）テストケース継承の振る舞いを使用することにより、テストを継承されたメソッドを用いて適正に実行することができる。属性が定義された継承は、クラス階層に基づいてメソッドを順序付ける（順序は存在する属性によって判定される）方法を提供する。例えば、セットアップステップは、（サブクラスに次いで基本クラスでも、ランダム式でもなく）まず基本クラスで、次にサブクラスで、以下同様に再帰的に実行される。以下で図２を参照して説明するように、実行エンジンはどのメソッドを継承すべきか、そしてそれらのメソッドを実行する順序を判定する。
【００１６】
以下に、テストケース継承を例示するための擬似コードの一例を示す。
【００１７】
【表１】
2005293578.tif 000003
【００１８】
テストクラスApplicationSpecificTestのために実行されることになるテストメソッドを、これらが実行されるべき順序でリストする。
【００１９】
【表２】
2005293578.tif 000004
【００２０】
上記の例では、インデントがクラス階層を意味し、与えられたクラスおよびサブクラスのメソッドについての継承の原理を例示している。例えば、ApplicationSpecifcTest.Setupは、TestEnvironmentBase.Setupクラスから継承する（テスト作成者が、別途、選択しない限り、そしてその場合、テスト作成者はそのメソッドが継承されるべきでないと指定することができる）。
【００２１】
したがって、テスト作成者は、基本クラスから派生するメソッドを書き、必要に応じてサブクラスに継承の原理を選択的に適用することができる。抽出エンジンはクラス階層に従ってメソッドを順序付け、それによって実行順序を判定する。メソッドの順序付けは属性内で定義される比較関数を使用して達成することができ、その結果、属性自体を用いてクラス階層を判定することができる。基本クラスを変更することにより、継承が「オフ」にトグルされることを属性が記述していない限り、そのサブクラスが自動的に変更される。
【００２２】
さらに、テストメソッドの状態を変更する属性を継承することもできる。例えば、（ネガティブテストの場合）ある例外が予期されると記述する属性を継承することができる。この予期は継承され、テストメソッドの結果の状態を「失敗」から「合格」に変更し、それによって、テストメソッドが例外をスローする場合、デフォルトの失敗ケースがオーバライドされる。
【００２３】
（テスト自動化システムのアーキテクチャ）
図２は、本発明を実施するための例示的な環境を示すブロック図である。図２に示す例示的な環境は、テストハーネス２１０、テストランタイム２２０およびテストケースシナリオ２３０を備えるテスト自動化システム２００である。
【００２４】
（テストランタイム）
一実施形態では、テストランタイム２２０は、テストハーネスからのテストケースの知識を抽象するオブジェクトのコレクションである。テストランタイム２２０は、通常、テストサービス提供オブジェクト２２１、抽出エンジン２２２、属性２２３およびテストメソッド実行機能２２４を備える。異なるハーネスによってテストランタイム２２０が使用されて、特定の型のテストケースフォーマットについて一貫したサポートを提供することができる。拡張により、テストハーネスは、異なるテストランタイムを用いて異なる型のテストケースフォーマットをサポートすることができる。テストハーネスは、通常、どのテストランタイムを特定のテストケースフォーマットに使用するかを判定する。
【００２５】
テストケース抽出は（以下で説明するテストサービス提供オブジェクト２２１から得られる）専用の抽出オブジェクトを介して達成され、呼び出しはオブジェクト（やはり以下で説明するテストメソッド実行機能２２４）によって行われ、それによりテストハーネスにジェネリックな結果を返す。テストメソッド実行機能は、メソッドの実行を制御するために汎用インターフェースを用いて属性を評価する。
【００２６】
テストハーネスは、例えば、属性を評価したり、テストメソッドが実行されるべき順序を判定したり、メソッド呼び出しのための引数リストを構築したりする必要はない。テストハーネスは、通常、それらのタスクを行うのに必要とされるこの情報に直接的なアクセスを持たず、それによって異なるテストハーネス間でより一貫したテスト実行を保証する助けになる。すべてのテストハーネス依存機能（ロギング、「リモーティング」など）は、テストハーネスによって実装され、インターフェースによって記述され、テスト実行中の使用のためにテストサービス提供オブジェクトに格納されるオブジェクトであるべきである。したがって、テストハーネスコードへの変更を要することなく、異なるテストランタイム間で切り換えることが簡単に可能なテストハーネスを作成することができる。
【００２７】
（テストサービス）
テストサービス提供オブジェクト２２１は、テストハーネスによって使用されて抽出エンジンを取り出し、また、テストケースシナリオによって使用されて（ロギング、同期などのテストサービスを含む）テストハーネス実装機能のオブジェクトを取り出す。
【００２８】
テストサービス提供オブジェクトは、通常、テストサービスへのアクセスを容易にするために使用されるメソッドを提供する。AddServiceメソッドがコールされて、テストサービスを実施するオブジェクトへの参照を格納する。テストサービスオブジェクトは「ジェネリック」型を実装すべきであり、それにより異なるハーネスが提供することのできる１組の標準サービスを容易にする。渡されるオブジェクトは、属性またはテストメソッドによって必要とされる機能を実装すべきである。このメソッドは、テストハーネスによってテストハーネスが提供する各サービスについてコールされるべきである、これは、一般に、テストメソッドが実行される前に行われる。
【００２９】
GetServiceメソッドは、通常、ある型のテストサービスオブジェクト取り出すためにコールされる。渡される型は、テストサービスオブジェクトによって実装されるインターフェースを表すべきである。そのオブジェクトを実装するオブジェクトが、見つかると、返される。オブジェクトが見つからない場合、そのような結果を示す値が返される（例えば、ヌルを返す）。テストまたは属性が、存在しないテストサービスを要求する場合、実行されているテストメソッドは失敗するはずである。
【００３０】
AddDefaultServices保護メソッドは、通常、構築機能によってコールされる。これは、通常、抽出エンジンなど、テストランタイムがデフォルトで提供するどのテストサービスをも付加するのに使用される。
【００３１】
テストサービス提供オブジェクトデータおよびメソッドコールは、テストハーネスによって設定されたデータが、時間的に後の時点で、テストサービス提供機能への他のコールによって取り出し可能であるように、静的とすべきである。このオブジェクトは、通常、上述の機能を実装するクラスである。通常、このオブジェクトの構築機能を使用してAddDevaultServicesメソッドがコールされる。
【００３２】
（抽出エンジン）
抽出エンジン２２２は、特定のテストケースシナリオのためにテストハーネスのテストケースからテストメソッドの順序付けられたリストを取り出すのに使用される。通常、テストランタイムには１つの抽出エンジンだけしか存在しない。
【００３３】
GetTestMethodWrappersメソッドを用いて、テストケースシナリオのためのテストメソッドの順序付けられたリストが取り出される。（テストメソッドラッパーは、テストメソッド実行機能の１つの特定の実装形態である。）パラメータが、テストケースを保持するコンテナを表すメソッドに渡される。このメソッドは、メソッドの順序付けられたリストを返す。テストケースを抽出している間にエラーが発生した場合、例外を「スロー」することができる。テストケースまたはテストメソッドが見つからない場合、普通、空のリストが返される。空のリストは、普通、テストハーネスによって失敗として取り扱われる。抽出エンジンに追加のデータを渡す必要がある場合、TestServicesProviderオブジェクトを介してTestHarnessDataProviderテストサービスによって提供することができる。
【００３４】
抽出エンジンオブジェクトに存在する機能の大部分は異なるランタイム間で同じである。あるランタイムと別のランタイムで大きく異なり得る唯一の詳細は、どの属性が使用されるかだけである。新しい抽出エンジンおよびランタイムの簡単な作成を容易にするようにオブジェクトが作成されるべきである。このクラスは、通常、以下の関数を実装する。
【００３５】
TypeIsATestCaseは、渡された型がテストケースである場合は「真」を、そうでない場合は「偽」を返す。この関数は、テストケース属性を探すことによって型に関して存在する属性を検査して、型がテストケースであるか否か判定する。
【００３６】
MethodIsATestMethodは、渡されたメソッドがテストメソッドである場合は真を、そうでない場合は偽を返す。この関数は、実行属性を探すことによって型に関して存在する属性を検査して、型がテストメソッドであるか否か判定する。
【００３７】
GetMethodWrappersFromTypeは、実行属性を有する、型に関するすべての該当する公開の非静的メソッドを集め、それらのメソッドを（以下で論じる）MethodWrappersの順序付けられたリストとして返す。．ＮＥＴ環境を使用する一実施形態では、このリストは．ＮＥＴ配列に組み込まれたソート機能を用いて順序付けられ、MethodWrapperが比較ルーチンをコールしてリストを順序付ける。その型のインスタンスが作成できない場合、このメソッドは失敗し、空のリストを返す。
【００３８】
抽出エンジンは、テストサービスを用いて、テスト抽出を変更するために使用することができる情報を取り出すことができる。この情報は、テスト抽出情報を格納するために定義されたスキーマに従うＸＭＬファイルなどのファイルに格納することができる。テストサービスによって提供されたデータがスキーマに従ってＸＭＬファイルを参照しない場合、その変更データを無視することができる。
【００３９】
抽出エンジンは、通常、指定されたすべての抽出修飾ＸＭＬファイルをロードする。ＸＭＬファイルの内容は、例えば、テスト包含とテスト排他という２つの「バケット」に入れられる。両方のバケットが空である場合、抽出エンジンは、すべてのテストを含むべきである。このケースは、抽出修飾ＸＭＬファイルがないこと、または抽出エンジンデータソーステストサービスを取り出すことができないことと等価である。排他バケットだけが空である場合、抽出エンジンはすべてのテストを含むべきである。包含バケットだけが空である場合、抽出エンジンは、すべてのテストを含み、排他バケットにリストされたテストを除外すべきである。両方のバケットがデータを有する場合、抽出エンジンは、（排他リストが包含リストに対して制御権限を有するように）排他バケットにリストされていない包含バケット中のテストを含むべきである。
【００４０】
（テストメソッド実行機能）
テストメソッド実行機能２２４は、呼び出し側がメソッドまたはその属性について事前の知識を有することを要求することなくテストメソッドを実行するために使用される。Invoke（呼び出し）メソッドがテストメソッドを実行するためにコールされる。その操作の結果を保持するオブジェクトが返される（合格、失敗、スキップなど）。Invokeメソッドは、メソッドに関連付けられた属性を処理し、呼び出されているメソッドのためのパラメータリストを（必要なら）作成する役割を果たす。実行は、通常、テストメソッドに関連付けられた属性によって変更される。
【００４１】
Abort（打ち切り）メソッドをコールして現在実行中のテストメソッドを打ち切ることができる。通常、打ち切りにより、現在実行中のInvokeメソッドが返されることになる。打ち切りが行われた後、普通、さらなるテストを実行することはできない。
【００４２】
CompareToメソッドは、２つのテストメソッドラッパーを比較するためにコールされる。返された結果がゼロ未満である場合、それは、このメソッドを、（そのメソッドが比較される）他方のテストメソッドラッパーの前に実行すべきであることを示す。返された結果がゼロに等しい場合、それは、両メソッドが実行される順序は問題にならないことを示す。返された結果がゼロより大きい場合、それは、そのメソッドを、他方のテストメソッドラッパーの後で実行すべきであることを示す。
【００４３】
GetMethodAttributesメソッドは、共通の基本メソッド属性クラスから派生する、テストメソッドに関連付けられた属性のソートされたリストを取り出すためにコールされる。属性のこのソートされたリストは、テストメソッドラッパーによっていくつかのロケーションで使用される。例えば、（前述の）Invokeメソッドは、このソートされたリストを用いて、正しい順序で属性を評価する。また、GetMethodAttributesを用いて１つのメソッドラッパーを別のメソッドラッパーと比較することができる。「get AttributesDescription」などのコールは、属性の順序付けられたリストを用いて、メソッドに関連付けられた属性のストリング記述を作成する。
【００４４】
テストメソッドラッパーは、「get Description」や「get Name」をコールするなどによって、テストハーネスによる使用のために取り出すことのできるいくつかのプロパティを有する。このプロパティは、メソッドの名前、およびメソッドが定義されたクラスから生成される。他のプロパティも必要に応じて付加することができる。これらのプロパティは、ハーネスがクエリされているテストメソッドについて何かを知っていることを必要とせず、既存のテストハーネスへの変更を要求することなく追加のプロパティを付加することができることに留意されたい。
【００４５】
MethodResultオブジェクトは、テストメソッドラッパーの結果をテストハーネスに伝えるのに使用される。テストハーネスは、必ずしも、呼び出されているメソッドの事前の知識を有するとは限らないので、それらの結果は抽象形で表現される。
【００４６】
このオブジェクトは、通常、メソッドを実行しようとすることによる３つの可能な結果、すなわち合格、スキップまたは失敗を表す必要がある。「合格」は、通常、メソッドがエラーなしで実行を完了したこと（例えば、メソッドが失敗をログしなかった、テストメソッドが例外をスローしなかった、属性のいずれにもエラーがなかったなど）を示すであろう。「エラー」は、メソッドが失敗したこと（例えば、テストメソッドが失敗を示した、または属性が失敗を示したなど）を示すであろう。「スキップ」は、メソッドが実行されずにスキップされたこと（例えば、属性が、テストメソッドはサーバ上でのみ実行すべきであると指定しているが、テストがクライアントマシン上で実行され、その場合、メソッドはスキップされるであろう）を示すであろう。
【００４７】
MethodResultオブジェクトは、結果メッセージおよび／またはエラーメッセージといったオプションのメッセージも含むことができる。結果メッセージは、そのメソッドの結果について人間が読める記述とすることができる。メソッドの正常な実行により、これは空白のままとすることもでき、または記録された合格の数を含むこともできる。エラーが生じた完了メソッドについては、エラーのテキスト記述を含むことができ、他方、エラーメッセージはそのエラーの詳細を含むことができる。
【００４８】
属性によって例外が「スロー」されるとき、TestConditionExceptionクラスを用いて変更されたメソッド状態を伝えることができる。例えば、メソッド状態に直接マップする３つの派生クラスは、TestSkipException、TestSucceededExceptionおよびTestErrorExceptionを含む。
【００４９】
属性２２３は、通常、テストの実行を変更し、制御するのに使用される。テストはテストケースシナリオに従って実行され、これは属性の使用を通じて定義することができる。属性の少なくとも３つの基本タイプ、すなわち、クラスレベル属性、メソッドレベル属性、パラメータレベル属性を使用することができる。
【００５０】
テストクラス属性はオプションであり、これを使用して、テスト抽出をスキップしたり、または指示された型について複数回行わせたりすることができるように、インスタンス化されたオブジェクト状態を変更することができる。通常、インスタンス化されたオブジェクト状態を変更するのに、事前および事後抽出メソッドが使用される。テストクラス属性は、テストケースシナリオ中のそのような変化が実装され得るようにすることができる。
【００５１】
メソッドレベル属性は、メソッドパラメータおよびメソッド実行を変更することができる。一実施形態では、メソッドレベル属性は、実行属性および補足属性を含む。両属性とも、事前および事後呼び出しメソッドを有する。メソッドレベル属性が評価される順序は順序プロパティによって判定され、これはその属性が書かれるときに定義される。ただし、属性は、通常、どんな他の属性が存在し得るかの事前の知識を持たない。各段階での実行変更は、プライオリティベースの状態システムによって取り扱うことができる。すなわち、通常、最高のプライオリティで状態を返す属性を用いて、どのように実行が変更されるかを判定する。
【００５２】
実行属性は、メソッドをテストメソッドとしてマークするのに使用される。実行属性のないメソッドは、普通、テストには含まれない。実行属性の中心的役割は、テストにハイレベルの順序を確立し、メソッドの結果を評価することである。１つのメソッドは、複数の実行属性を有するべきではない。複数の実行属性が存在するときの抽出および実行の振る舞いは、普通、未定義である。実行属性の例には、「Setup（セットアップ）」属性、「Step（ステップ）」属性、「Teardown（ティアダウン）」属性が含まれる。
【００５３】
補足属性は、補足的アクションを行ってテストメソッドの実行を変更する。補足属性の中心的役割は、テストの実行に必要な二次的タスクを行うことである。それらは、通常、ハイレベルの順序を指示するために使用されない。１つのメソッドは、任意数の補足属性を有することができる。補足属性の例には、「WaitFor」属性および「Target」属性が含まれる。
【００５４】
パラメータレベル属性は、メソッドへのパラメータ入力を変更し、メソッドが実行された後でオブジェクトの状態（例えば、コンテキスト状態）を変更するために、オプション的に使用される。パラメータレベル属性は、普通、メソッドレベル属性が使用されるので、テストの実行を変更するためには使用されない。しかしながら、例外がスローされる場合、テストメソッドは、その例外に応答してすぐに失敗する。一実施形態では、パラメータ当たり１つのパラメータレベル属性だけしかなく、複数のパラメータレベル属性を有する振る舞いは未定義のままとされる。パラメータレベル属性は、メソッドが呼び出される前にメソッドレベル属性が評価された後と、メソッドが呼び出された後でメソッドレベル属性が評価される前に評価される。パラメータレベル属性の一例には、「ContextMapping」属性が含まれる。
【００５５】
MethodStateオブジェクトは、メソッド属性によって、テストメソッドの実行を制御するために使用される。複数の属性を１つのテストメソッドに割り当てることができるので（各属性は潜在的にそのテストメソッドの実行を変更することができるので）、各属性はMethodStateオブジェクトとやりとりしてテストメソッドの一貫した実行を保証することができる。
【００５６】
MethodStateオブジェクトは、実行状態、メッセージ、エラーコードおよび状態オーバライドプライオリティに関連する情報を含むことができる。実行状態は、メソッドがどのように終了したか（例えば、スキップ、合格、失敗）、状態が変更されるのが許されているかどうか、そしてメソッドが実行されるべきかどうかに関する情報を備える。メッセージは、なぜそのテストメソッドが特定の状態にあるかを示すテキストをオプション的に提示するために使用することができる。エラーコードは、テストメソッドを実行している間にテストメソッドラッパーが遭遇する可能性のあるエラーの詳細を示すために使用することができる。状態オーバライドプライオリティフィールドは、新しい状態が既存の状態より大きいプライオリティを有する場合に限って実行状態、メッセージおよびエラーコードを変更可能にすることによって、テストメソッド実行の一貫性を改善するために使用することができる。
【００５７】
テストメソッドラッパー（２２４）は、終了状態に達するまでテストメソッドを実行する。終了状態に達すると、MethodResultオブジェクトが最終MethodStateオブジェクトから構築される。
【００５８】
実行属性は、メソッド呼び出しから得られた結果をパースする役割を果たす。メソッドが合格したか、それとも失敗したか判定するために、合格および失敗エントリのログを監視することができる。何らかの失敗がログされる場合、そのメソッドは失敗した可能性が高い。合格も失敗もログされなかった場合、そのメソッドも失敗した可能性が高い。例外がテストメソッドまたは任意の属性からスローされた場合、そのメソッドもやはり失敗した可能性が高い。そうでない場合、そのメソッドが（正常に）合格したとみなすことができる。
【００５９】
（テストケースシナリオ）
一実施形態では、テストケースシナリオ２３０は、特定のテストケースについてのテストメソッドの実行をコーディネートするオブジェクトのコレクションである。それらのテストメソッドは、テストメソッド実行機能（２２４）によってまたはテストメソッド実行機能を通して提供されるインターフェースのために、テストハーネスの事前の知識なしで書くことができる。
【００６０】
テストケースシナリオ２３０は、通常、テストメソッド２３１およびその他のメソッドおよびデータ２３２を備える。テストメソッドは、具体的なテストハーネスにクエリすることによってではなく、（テストメソッド実行機能を備える）ランタイムオブジェクトを用いることによってテストハーネスオブジェクトにアクセスする。
【００６１】
（テストハーネス）
一実施形態では、テストハーネス２１０は、テストケースの実行をコーディネートし、様々なテストサービスを提供するオブジェクトのコレクションである。テストハーネス２１０は、通常、ＵＩ（ユーザインターフェース）２１１、実行エンジン２１２、コンテキストオブジェクト２１３およびロギングオブジェクト２１４を備える。追加機能のためのテストハーネスは、自動化システムインターフェースなどの他のオブジェクトを備えることがある。
【００６２】
実行エンジン（２１２）は、テストランタイム（２２０）を用いてテストケースシナリオをロードし、実行する役割を果たす。図３に、本発明の態様による、実行エンジンのプロセス３００のフローを例示する。開始ブロックの後、プロセスはブロック３１０に進み、その時点でテストランタイムがロードされる。テストランタイムが．ＮＥＴで書かれている一実施形態では、テストランタイムアセンブリおよびテストケースシナリオアセンブリがAppDomainにロードされる。テストハーネスは、ロードされた．ＮＥＴランタイムのバージョンや、使用されているテストランタイムのバージョンなどの情報を表示することができる。
【００６３】
ブロック３２０で、１つまたは複数のテストケースがメモリにロード／コンパイルされる。それらのテストケースは、事前にコンパイルし、メモリにロードすることも、メモリにロードしてからコンパイルすることもできる。テストハーネスは、テストケースシナリオ、ならびにテストケースシナリオが正常にロードされ、そして／またはコンパイルされたかどうかに関する情報を表示することができる。
【００６４】
ブロック３３０に進み、抽出エンジンが取得される。抽出エンジンは、まずテストサービス提供オブジェクト（２２１）を取り出すことによって取得される。次に、基本抽出エンジンの型がテストメソッド実行機能（２２０）から判定される。テストサービス提供オブジェクト上で静的GetService関数がコールされて（基本抽出エンジンの型をテストサービス提供オブジェクトに渡す）抽出エンジンへの参照が受け取られる。
【００６５】
ブロック３４０で、テストハーネス機能がテストサービス提供機能に付加される。テストサービス提供機能上でAddServiceメソッドを用いて、テストサービス提供機能に、テストハーネス上で実装されるテストサービスが付加される。それらのテストサービスは、リブート機構、ロギング、コンテキストなど様々なインターフェースを実装するオブジェクトを含む。抽出エンジンにデータを渡すことが望ましい場合（例えば、あるメソッドを含むか、またはスキップすべきであろうことを指定するＸＭＬファイルなど）、テストハーネスデータ提供インターフェースを実装するテストサービスオブジェクトを使用することができる。
【００６６】
ブロック３５０で、抽出エンジンを用いてテストケースステップを得る。ブロック３３０で得られた抽出エンジンを用いて抽出エンジンのGetTestMethodWrappersメソッドをコールし、そのメソッドに、テストケースを保持するAppDomainを渡す。通常、TestMethodWrappersの配列が返される。
【００６７】
メソッドラッパーの配列は、通常、テストアクションがその配列中に存在する順序で実行されるべきテストアクションのリストを収容する。（抽出エンジンは、通常、配列を順序付ける役割を果たす。）
ブロック３６０で、ブロック３５０で取り出されたメソッドのリストが、それらのメソッドがリストされている順序で実行される。各メソッドは、Invokeメソッドをコールすることによって実行される。この呼び出しメソッドは、通常、テストアクションの結果に関する詳細を返す。この詳細は、成功／失敗／スキップ、ならびに追加の詳細を含むことができる。この結果の詳細は、例えば、ログしたり、またはＵＩを更新したりするために使用することができる。
【００６８】
図４に、本発明の態様による、実行エンジンのプロセス４００のフローを例示する。各テストアクションについて、プロセス４００が繰り返される。実行エンジンは、InvokeInstanceMethodをコールして、特定のテストアクションの実行を開始する。InvokeInstanceMethodは、InstanceMethodをコールしてその特定のテストアクションを呼び出す。次に、InstanceMethodは、メソッドラッパー（すなわち、テストメソッド実行機能例）をコールしてその特定のテストアクションを呼び出す。
【００６９】
メソッドラッパーは、特定のテストアクションの属性（事前呼び出し）を評価し、実行する。メソッドラッパーは次に、評価／実行されたテストメソッドに従ってテストメソッドを呼び出す。テストメソッドが実行された後、その属性が再び評価／実行される（事後呼び出し）。メソッドラッパーは、事後呼び出し属性評価の結果を解釈し、その結果を知らせる値を返す。ActionResultがInstanceMethodに、そしてInvokeInstanceMethodに渡される。InvokeInstanceMethodは戻り値を評価し、その結果を実行エンジンに渡す。
【００７０】
本発明のさらなる説明として、以下に擬似コードのリストを提供する。
【００７１】
【表３】
2005293578.tif 000005
【００７２】
【表４−１】
2005293578.tif 000006
【００７３】
【表４−２】
2005293578.tif 000007
【００７４】
【表５】
2005293578.tif 000008
【００７５】
【表６−１】
2005293578.tif 000009
【００７６】
【表６−２】
2005293578.tif 000010
【００７７】
【表７】
2005293578.tif 000011
【００７８】
【表８】
2005293578.tif 000012
【００７９】
【表９】
2005293578.tif 000013
【００８０】
【表１０】
2005293578.tif 000014
【００８１】
上記の仕様、例およびデータは、本発明の構成の作成および使用の完全な説明を提供するものである。本発明の多くの実施形態が本発明の趣旨および範囲を逸脱することなく実施することができるので、本発明は本明細書に添付した特許請求の範囲に存する。
【図面の簡単な説明】
【００８２】
【図１】本発明の例示的な一実施形態で使用することのできる例示的なコンピューティングデバイスを示す図である。
【図２】本発明を実施するための例示的な環境を示すブロック図である。
【図３】本発明の態様による実行エンジンのプロセス３００フローを示す図である。
【図４】本発明の態様による実行エンジンのプロセス４００フローを示す図である。
【符号の説明】
【００８３】
１００  コンピューティングデバイス
１０２  処理ユニット
１０４  システムメモリ
１０５  オペレーティングシステム
１０６  アプリケーション
１０７  プログラムデータ／ヒープ
１０９  リムーバブルストレージ
１１０  非リムーバブルストレージ
１１２  入力デバイス
１１４  出力デバイス
１１６  通信接続
１１８  他のコンピューティングデバイス
１２０  ヒープＡＰＩ
２００  テスト自動化システム
２１０  テストハーネス
２１１  ユーザインターフェース
２１２  実行エンジン
２１３  コンテキスト
２１４  ロギング
２１５  同期
２２０  ランタイム
２２１  テストサービス提供機能
２２２  抽出エンジン
２２３  属性
２２４  テストメソッド実行機能
２３０  テストケースシナリオ
２３１  テストメソッド
２３２  その他のメソッド／データ
【図１】
2005293578.tif 000015
【図２】
2005293578.tif 000016
【図３】
2005293578.tif 000017
【図４】
2005293578.tif 000018
【外国語明細書】
2005293578000001.pdf