3

長いインターネット検索の後、次の質問をしたいと思います。

C++ で記述されたシミュレーション コードのビルドと単体テストに Jenkins を使用しています。

これは非常にうまく機能します。フィットネスとロボットフレームワークを調べた後、次のテスト問題をまだ実行できません。

私のプログラムは、入力ファイルを読み取り、出力データを計算するコマンドライン プログラムです。(例: simcode.exe -j input##.inp --> output.dat)

Web インターフェイス経由でテスト スイートを作成する方法を探しています。つまり、テスト ケースごとに入力ファイルといくつかの参照出力データを提供し、テスト スイートは Jenkins のビルドが成功した後に実行されます。出力データと参照出力データの差分結果をもとに、Jenkinsに渡せるxmlファイルを作成する必要があります。この xml ファイルには、すべてのテスト ケースの結果に関する情報 (成功したかどうかなど) が含まれている必要があります。

xml ファイルの情報が再度 Jenkins に表示されるはずです。

プログラムにライブラリをコンパイルする必要がないアプローチを探しています。

RobotFrameworkでそれを達成する方法を説明するヒントがあれば、とても感謝しています。(それは可能ですか?)

前もって感謝します!

4

2 に答える 2

1

Robot Framework はテスト自動化ツールです...これを使ってさまざまなことを行うことができます...

Webインターフェースを介したテストスイートの意味がよくわかりません...しかし、一般的に、あなたが説明する機能はRobotFrameworkで実行できるようです...

簡単に

多くのテスト ケースを含むテスト スイートを作成できます。たとえば、チェックしたい入力ファイルを 1 つまたはすべて含めることができます。

OperatingSystem Build In Libraryには、おそらく使用できるキーワード Run があります。コマンドをリモートで実行している場合は、オプションのSSHLibraryから Execute Command を使用できます。

テスト ケースごとに、コマンドを実行するステップと、出力ファイルを期待どおりに検証する別のステップを作成できます。それらが一致する場合、テスト ケースは合格としてマークされ、一致しない場合は不合格としてマークされます...

RobotFramework は、実行するすべてのテスト スイートに対して、html 形式のログおよびレポート ファイルを生成できます。

Jenkins と Hudson には、RobotFramework 用のプラグインがあり、これらの出力ファイルを非常にうまく表示するために使用できます。つまり、成功/失敗したテスト ケースの数

于 2011-11-11T17:11:03.120 に答える
0

あなたが望むものは特効薬のようです。実行可能です。何かをコンパイルする必要はありませんが、ロボット フレームワークに関するいくつかのロジックを記述する必要があります。

  1. 私が理解している限り、CLIで何かを呼び出す必要があります-これは簡単です.ロボットはすでにこれを行っています
  2. 入力ファイルといくつかの出力データがあります - 些細なことです - ロボットはすでにこれを行っています
  3. 実際の出力データと予想される出力データを比較する必要があります。
  4. ログをパッケージ化します - ロボットはすでにこれを行っています。
  5. それらをJenkinsに提示します-簡単です-ロボットはすでにこれを行っています。

したがって、すべての重労働はすでに完了しています。

  1. CLI の呼び出し - OperatingSystem を使用

    *** Settings ***
     Library  OperatingSystem
    
    *** Test Cases ***
    Basic test
        Run Me A Command  simcode.exe -j input01.inp
    
    *** keywords ***
    Run Me A Command 
        [Arguments]  ${command} 
        ${rc}   ${output} =     Run and Return RC and Output    ${command}
        Log  ${output}
        Should Be Equal As Integers  ${rc}  0   
    
        Should Not Contain  ${output}  FAIL
    
  2. 入力に柔軟なアプローチが必要な場合

    *** settings ***
    Library  OperatingSystem
    
    *** Test Cases ***
    Combinations
        [Template]  Basic test
        input01.inp
        input02.inp
        input03.inp
    
    *** keywords ***
    Basic test
        [Arguments]  ${input}
        Run Me A Command  simcode.exe -j ${input}
    
    
    Run Me A Command 
        [Arguments]  ${command} 
        ${rc}   ${output} =     Run and Return RC and Output    ${command}
       Log  ${output}
       Should Be Equal As Integers  ${rc}  0    
    
        Should Not Contain  ${output}  FAIL
    
    1. 次に、2 つのファイルの内容を比較する必要があります...ファイルを便利な場所に移動したと仮定すると、内容を比較するためのキーワードを自分で書くことができます。

      *** settings ***
      Library  OperatingSystem
      
      *** Test Cases ***
      Combinations
          [Template]  Basic test
          ../resources/input01.inp  ../resources/expectedoutput01.out
          ../resources/input02.inp  ../resources/expectedoutput02.out
          ../resources/input03.inp  ../resources/expectedoutput03.out
      
      *** keywords ***
      Basic test
          [Arguments]  ${input}  ${expected_output}
          Run Me A Command  simcode.exe -j ${input}
          Log File  output.data
          Compare Files  ${expected_output}  output.data
      

コンテンツが ini 形式のパラメーターのリストであると仮定しましょう。たとえば、入力ファイルにある数値の平方根を計算するとします。

期待されるデータをどのように保存しますか? expected.dat というファイルがあるとします。

[defaults]
n_1=1
n_4=2
n_9=3

そして、output.data があります。

[defaults]
n_1=1
n_4=2
n_9=2

次に、ファイル コンパレータを自分で作成する必要があります。ファイルが同一であると確信している場合は、diff と OperatingSystem ライブラリを使用するか、次のような単純なコンパレータを記述できます。

def get_param(self,theFile)
    config = ConfigParser.RawConfigParser()
    config.read(theFile)
    return config.items("defaults")


def compareMyDict(self, expected, actual):  #There are better ways of doing this 
    for k, v in actual:
        if v != expected[k]:
            print("error message")
            print(k)
            print(v)
            print(expected[v])
            #print whatever you deem fit
            return
        print("Matched OK " + str(k))
        print(k)
        print(v)
        print(expected[v])

def compare_files(self, expectedFile, actualFile):
    '''
    From sourceFile formatted
    [defaults]
    key=value
    '''

    d1 = get_param(expectedFile)
    d1 = get_param(actualFile)

    compareMyDict(d1,d2)
    checkLenghts(d1,d2)
    criteria2(d1,d2)    
    #etc.

4 と 5. 実行後、パブリッシュ アーティファクト プラグインとパブリッシュ ロボット結果プラグインを使用して、適切にフォーマットされた出力を Jenkins に渡します。

出来上がり!

PS: コードが実行されない可能性があります。単純なエディターで構文を強調表示せずにフリースタイルで記述したため、テストしていません。

于 2015-04-20T11:31:59.940 に答える