カスタム比較ツールの開発 - チュートリアル

関連:GUI テストおよびコンポーネント

このチュートリアルでは、Microsoft Visual Studio を使って C++ でカスタム比較ツールを作成するプロセスを段階的に案内します。作成するカスタム比較ツールは、OpenText Functional Testing に付属しているサンプルのカスタム比較ツールと似ています。独自のカスタム比較ツールも同じ方法で作成できます。サンプルのカスタム比較ツールに関する詳細は、ビットマップ・チェックポイント・カスタム比較ツール・サンプルの使用を参照してください。

注: このチュートリアルに関連するタスクについては、カスタム比較ツールの開発を参照してください。

このセクションの指示に従って、次のような COM オブジェクトを作成します。

  • 比較する 2 つのビットマップと設定文字列を受け取り、2 つのビットマップ(のサイズ)を比較し、必要な結果を返す CompareBitmaps メソッドを実装する。

  • [ビットマップ チェックポイントのプロパティ]ダイアログ・ボックスに表示される情報を返す、GetDefaultConfigurationString メソッドと GetHelpFilename メソッドを実装する。

  • OpenText Functional Testing ビットマップ比較ツールのコンポーネント・カテゴリに登録する。

カスタム比較ツールの設計が完了したら、インストールして登録し、OpenText Functional Testing で使用してビットマップ・チェックポイントを実行できます。

注: チュートリアルを実行するのに使用する Microsoft Visual Studio のバージョンに応じて、コマンド名が異なることもあります。

新しい ATL プロジェクトの SampleCPPCustomComparer の作成

  1. Microsoft Visual Studio で、[新規作成]>[プロジェクト]を選択します。[新規プロジェクト]ダイアログ・ボックスが開きます。

  2. ATL プロジェクト]テンプレートを選択し、プロジェクトの[名前]ボックスに「SampleCPPCustomComparer」と入力して、[OK]をクリックします。[新規 ATL プロジェクト]ウィザードが開きます。

  3. アプリケーション設定]で、[属性]オプションが選択されていないことを確認し、[完了]をクリックします。

先頭に戻る

新しいクラスの作成 - CBitmapComparer

  1. クラス・ビューで、[SampleCPPCustomComparer]プロジェクトを選択して右クリックし、[追加]>[クラス]を選択します。[クラスの追加]ダイアログ・ボックスが表示されます。

  2. ATL Simple Object]を選択し、[追加]をクリックします。[ATL 簡易オブジェクト ウィザード]が開きます。

  3. 省略名]ボックスに、BitmapComparer と入力します。ウィザードはこの名前を使って、クラス、インタフェース、および作成されるファイルの名前を作成します。

  4. タイプ]ボックスに、Sample Custom Comparer と入力します。これは、[ビットマップ チェックポイントのプロパティ]ダイアログ・ボックスの詳細設定と実行結果に表示されるカスタム比較ツールの名前です。詳細については、カスタム比較ツール名の設定 - 任意を参照してください。

  5. 完了]をクリックします。ウィザードは、CBitmapComparer クラスの実装に伴う .cpp および .h ファイルなど、追加したクラスに必要なファイルを作成します。

先頭に戻る

CBitmapComparer クラスでの比較ツールのインタフェースの実装

  1. クラス・ビューで、[CBitmapComparer]を選択して右クリックし、[追加]>[インタフェースの実装]を選択します。[インタフェースの実装]ウィザードが開きます。

  2. Implement interface from]オプションで、[ファイル]を選択します。OpenText Functional Testing ビットマップ・チェックポイントの比較ツール・タイプ・ライブラリの場所を参照するか入力します。このタイプ・ライブラリは、 <Installdir>\dat\BitmapCPCustomization\BitmapComparer.tlbにあります。

    このウィザードには、選択したタイプ・ライブラリで使用できるインタフェース、IBitmapCompareConfigurationIVerifyBitmap が表示されます。

  3. 実装するインタフェースのリストに 2 つのインタフェースを追加し、[完了]をクリックします。

    BitmapComparer.h ファイルには、ウィザードによって、インタフェースを実装するのに必要な宣言、クラス、およびメソッド・スタブが追加されます。後続のステップで、これらのメソッド・スタブに実装を追加する必要があります。

    注: Microsoft Visual Studio 2005 では、ウィザードによって、IVerifyBitmap インタフェースで CompareBitmaps メソッドの署名が不正に生成されます。プロジェクトを正しくコンパイルできるようにするには、最後の引数のタイプ(pbMatch)を BOOL* から VARIANT_BOOL* に手動で変更します。

比較ツール・インタフェース・メソッドの関数本体の移動

  1. BitmapComparer.h および BitmapComparer.cpp ファイルを開きます。

  2. BitmapComparer.h では、(ウィザードによって作成された関数本体に基づいて)ビットマップ・チェックポイント比較ツール・インタフェース・メソッドの宣言、CompareBitmapsGetDefaultConfigurationString、および GetHelpFilename を作成します。

  3. ウィザードによってビットマップ・チェックポイント比較ツール・インタフェース・メソッドに作成された関数本体を BitmapComparer.h ファイルから BitmapComparer.cpp ファイルに移動します。

    このステップの最後には、BitmapComparer.cpp および BitmapComparer.h に次のコードが含まれます。

    // BitmapComparer.cpp : Implementation of CBitmapComparer
    #include "stdafx.h"
    #include "BitmapComparer.h"
    // CBitmapComparer
    // IBitmapCompareConfiguration Methods
    STDMETHODIMP CBitmapComparer::GetDefaultConfigurationString
                                            (BSTR * pbstrConfiguration)
    {
                  return E_NOTIMPL; 
    }
    STDMETHODIMP CBitmapComparer::GetHelpFilename(BSTR * pbstrFilename)
    {
                  return E_NOTIMPL; 
    }
    // IVerifyBitmap Methods
    STDMETHODIMP CBitmapComparer::CompareBitmaps
                            (IPictureDisp * pExpected, IPictureDisp * pActual, 
                            BSTR bstrConfiguration, BSTR * pbstrLog, 
                            IPictureDisp * * ppDiff, VARIANT_BOOL * pbMatch)
    {
                  return E_NOTIMPL; 
    }
    
    // BitmapComparer.h : Declaration of the CBitmapComparer
    #pragma once
    #include "resource.h"       // main symbols
    #include "SampleCPPCustomComparer.h"
    // CBitmapComparer
    class ATL_NO_VTABLE CBitmapComparer :
            public CComObjectRootEx<CComSingleThreadModel>,
            public CComCoClass<CBitmapComparer, &CLSID_BitmapComparer>,
            public IDispatchImpl<IBitmapComparer, &IID_IBitmapComparer, 
                        &LIBID_SampleCustomComparerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
            public IDispatchImpl<IBitmapCompareConfiguration, 
                        &__uuidof(IBitmapCompareConfiguration),
                        &LIBID_BitmapComparerLib, /* wMajor = */ 1, /*wMinor =*/ 0>,
            public IDispatchImpl<IVerifyBitmap, &__uuidof(IVerifyBitmap), 
                        &LIBID_BitmapComparerLib, /* wMajor = */ 1, /*wMinor =*/ 0>
    {
        public:
            CBitmapComparer()
            {
            }
            DECLARE_REGISTRY_RESOURCEID(IDR_BITMAPCOMPARER)
            BEGIN_COM_MAP(CBitmapComparer)
                COM_INTERFACE_ENTRY(IBitmapComparer)
                COM_INTERFACE_ENTRY2(IDispatch, IBitmapCompareConfiguration)
                COM_INTERFACE_ENTRY(IBitmapCompareConfiguration)
                COM_INTERFACE_ENTRY(IVerifyBitmap)
            END_COM_MAP()
            DECLARE_PROTECT_FINAL_CONSTRUCT()
            HRESULT FinalConstruct()
            {
                return S_OK;
            }
            void FinalRelease() {}
            // IBitmapCompareConfiguration Methods
    public:
            STDMETHOD(GetDefaultConfigurationString)(BSTR * pbstrConfiguration);
            STDMETHOD(GetHelpFilename)(BSTR * pbstrFilename);
            // IVerifyBitmap Methods
    public:
            STDMETHOD(CompareBitmaps)(IPictureDisp * pExpected,
                         IPictureDisp * pActual, BSTR bstrConfiguration, BSTR * pbstrLog,
                        IPictureDisp * * ppDiff, VARIANT_BOOL * pbMatch); 
    }; 
    OBJECT_ENTRY_AUTO(__uuidof(BitmapComparer), CBitmapComparer)
    

先頭に戻る

ビットマップ・チェックポイント比較ツール・インタフェース・メソッドの実装

このチュートリアルでは、OpenText Functional Testing に付属しているサンプルのカスタム比較ツールと似たカスタム比較ツールを実装します。サンプルのカスタム比較ツールに関する詳細は、ビットマップ・チェックポイント・カスタム比較ツール・サンプルの使用を参照してください。

カスタム比較ツールを作成する場合は、これがカスタム比較ツール・ロジックを設計するステップになります。カスタム比較ツールで受け取れる設定値、ビットマップを比較するのに使用するアルゴリズム、および提供される出力を定義します。

BitmapComparer.cpp ファイルには、#include <atlstr.h> を追加し、ビットマップ・チェックポイント比較ツール・インタフェース・メソッドを次のように実装します。

  • GetDefaultConfigurationString メソッド:

    STDMETHODIMP CBitmapComparer::GetDefaultConfigurationString
                                            (BSTR * pbstrConfiguration)
    {
            CComBSTR bsConfig("MaxSurfAreaDiff=140000");
            *pbstrConfiguration = bsConfig.Detach();
            return S_OK; 
    }
  • GetHelpFilename メソッド:

    STDMETHODIMP CBitmapComparer::GetHelpFilename(BSTR * pbstrFilename)
    {
            CComBSTR bsFilename ("..\\samples\\BitmapCPSample\\CPPCustomComparer\\SampleComparerDetails.txt");
            *pbstrFilename = bsFilename.Detach();
            return S_OK; 
    }
    

    注: GetHelpFilename メソッドが相対パスを返すと、OpenText Functional Testing<Installdir>\bin に対してこのパスを検索します。上記の実装によって、OpenText Functional Testing は CPP サンプル・カスタム比較ツールに付属しているドキュメント・ファイルを使用するよう指示されます。

  • CompareBitmaps メソッド:

    STDMETHODIMP CBitmapComparer::CompareBitmaps
                                        (IPictureDisp * pExpected, IPictureDisp * pActual, 
                                        BSTR bstrConfiguration, BSTR * pbstrLog,
                                        IPictureDisp * * ppDiff, VARIANT_BOOL * pbMatch)
    {
            HRESULT hr = S_OK;
            if (!pExpected || !pActual)
                return S_FALSE;
            CComQIPtr<IPicture> picExp(pExpected);
            CComQIPtr<IPicture> picAct(pActual);
            // Try to get HBITMAP from IPicture
            HBITMAP HbmpExp, HbmpAct;
            hr = picExp->get_Handle((OLE_HANDLE*)&HbmpExp);
            if (FAILED(hr))
                return hr;
            hr = picAct->get_Handle((OLE_HANDLE*)&HbmpAct);
            if (FAILED(hr))
                return hr;
            BITMAP ExpBmp = {0};
            if( !GetObject(HbmpExp, sizeof(ExpBmp), &ExpBmp) )
                return E_FAIL;
            BITMAP ActBmp = {0};
            if( !GetObject(HbmpAct, sizeof(ActBmp), &ActBmp) )
                return E_FAIL;
            CString s, tol;
            tol = bstrConfiguration;
            int EPos = tol.ReverseFind('=);
            tol = tol.Right(tol.GetLength() - EPos - 1);
            int maxSurfaceAreaDiff = _ttoi(tol);
            // Set output parameters
            CComPtr<IPictureDisp> Diff(pActual);
            *ppDiff = Diff;
            int DiffPixelsNumber = abs (ExpBmp.bmHeight * ExpBmp.bmWidth - ActBmp.bmHeight * ActBmp.bmWidth);
            *pbMatch = DiffPixelsNumber <= maxSurfaceAreaDiff;
            s.Format(_T("The number of different pixels is: %d."), DiffPixelsNumber);
            CComBSTR bs (s);
            *pbstrLog = bs.Detach();
            return hr; 
    }

先頭に戻る

コンポーネント・カテゴリに登録するカスタム比較ツールの設計

カスタム比較ツールとして作成する COM オブジェクトを OpenText Functional Testing で認識するには、OpenText Functional Testing ビットマップ比較ツールのコンポーネント・カテゴリに登録する必要があります。コンポーネント・カテゴリ ID は、<Installdir>\dat\BitmapCPCustomization\ComponentCategory.h に定義されています。

この登録は、ウィザードによってプロジェクトの一部として作成された SampleCPPCustomComparer.cpp ファイルの DllRegisterServer および DllUnregisterServer メソッドに実装できます。regsvr32.exe プログラムを使って DLL を実行すると、これらのメソッドが呼び出されます。

  1. <Installdir>\dat\BitmapCPCustomization フォルダをプロジェクトのインクルード・パスに追加します。

  2. SampleCPPCustomComparer.cpp ファイルを開き、#include "ComponentCategory.h" という行を追加します。

  3. SampleCPPCustomComparer.cpp ファイルで、ウィザードによって作成された DllRegisterServer および DllUnregisterServer メソッドを変更して、次のコードを含めます。

    STDAPI DllRegisterServer(void)
    {
             // registers object, typelib and all interfaces in typelib
             HRESULT hr = _AtlModule.DllRegisterServer();
            CComPtr<ICatRegister> spReg;
            hr = spReg.CoCreateInstance
                    (CLSID_StdComponentCategoriesMgr, 0, CLSCTX_INPROC);
            if (FAILED(hr))
                return hr;
            // register comparer to the OpenText Functional Testing bitmap comparers category 
            CATID catid = CATID_QTPBitmapComparers;
            hr = spReg->RegisterClassImplCategories(CLSID_BitmapComparer, 1, &catid);
            return hr; 
    }
    
    STDAPI DllUnregisterServer(void)
    {
            HRESULT hr = _AtlModule.DllUnregisterServer();
            CComPtr<ICatRegister> spReg;
            hr = spReg.CoCreateInstance
                    (CLSID_StdComponentCategoriesMgr, 0, CLSCTX_INPROC);
            if (FAILED(hr))
                return hr;
            // unregister comparer from the OpenText Functional Testing bitmap comparers category
            CATID catid = CATID_QTPBitmapComparers;
            hr = spReg->UnRegisterClassImplCategories(CLSID_BitmapComparer, 1, &catid);
            return hr; 
    }

    これらのメソッドの第 2 セクションに注意してください。OpenText Functional Testing ビットマップ比較ツール CATID_QTPBitmapComparers のコンポーネント・カテゴリへの登録を処理します。

先頭に戻る

DLL のコンパイルと実行

コンパイルした後に、regsvr32.exe を使用して DLL を登録します。これで、ビットマップ・チェックポイントのカスタム比較ツールが OpenText Functional Testing で使用できます。

先頭に戻る

カスタム比較ツールのテスト

  1. OpenText Functional Testing を開き、Windows の電卓アプリケーション(普通の電卓)でビットマップ・チェックポイントを作成します。

    [ビットマップ チェックポイントのプロパティ]ダイアログ・ボックスの詳細設定には[比較ツール]オプションがあり、OpenText Functional Testing 標準比較ツールまたはサンプル・カスタム比較ツールを選択できます。

  2. 電卓の[表示]を[関数電卓]に変更します。電卓オブジェクトのサイズが大きくなります。標準の OpenText Functional Testing 比較ツールを使って、チェックポイントを実行します。チェックポイントが失敗します。

  3. [ビットマップ チェックポイントのプロパティ]ダイアログ・ボックスで、チェックポイントを編集します。

    • 選択領域と実行時ビットマップを比較する]チェックポイント・モードが選択されていることを確認します。

    • 詳細設定]をクリックして[詳細設定]ダイアログ・ボックスを開き、[比較ツール]の[タイプ]ボックスで[Sample Custom Comparer]を選択します。

      入力]ボックスには、GetDefaultConfigurationString メソッドによって返される標準設定文字列 MaxSurfAreaDiff=140000 が表示されます。

      入力]ボックスには、GetDefaultConfigurationString メソッドによって返される標準設定文字列 MaxSurfAreaDiff=140000 が表示されます。

      詳細]をクリックすると、サンプル・カスタム比較ツールに関するドキュメントが含まれたテキスト・ファイルが開きます。

    この実習で設計した比較ツールは、期待されるビットマップと実際のビットマップのサイズがどの程度違うか検査し、その違いが設定文字列で定義したピクセル数より大きいと、チェックポイントが失敗します。

    標準設定の MaxSurfAreaDiff 値を使ってチェックポイントを実行すると、チェックポイントが成功します。別の表示に設定しても、電卓オブジェクトの全体サイズの差異が 140000 ピクセル未満になるからです(差異は約 80000 ピクセルです)。MaxSurfAreaDiff を 70000 に設定すると、チェックポイントが失敗します。

    実行結果を表示して、比較の後でカスタム比較ツールが OpenText Functional Testing に提供するテキスト文字列と差異ビットマップを確認します。

    先頭に戻る