2017-11-24 65 views
1

からUTCの日時を比較し、私はJMeterのJMeterのBeanShellのアサーションの解析とJSON

以下

でJSONレスポンスから更新日時バージョンに以前の日時バージョンを比較する必要が特定の要件は、私の以前の応答がありさ:

{ 
    "state": 
    { 
     "errorDetails": 
     [ 
     ] 
    }, 
    "results": 
    [ 
     { 
      "state": 
      { 
       "errorDetails": 
       [ 
       ] 
      }, 
      "id":"someNumber1", 
      "version":"2017-11-23T15:25:20.154+00:00", 
      "referenceId":"1234" 
     } 
    ] 
} 

と更新された応答:

{ 
    "state": 
    { 
     "errorDetails": 
     [ 
     ] 
    }, 
    "results": 
    [ 
     { 
      "state": 
      { 
       "errorDetails": 
       [ 
       ] 
      }, 
      "id":"someNumber1", 
      "version":"2017-11-23T15:25:22+00:00", 
      "referenceId":"1234" 
     } 
    ] 
} 

そして、私はJSON抽出を経てバージョンを抽出し、BeanShellのasserti以下にそれを渡していますように:

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

try{ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    long created = sdf.parse(vars.get("noteVersion")).getTime(); 
    long updated = sdf.parse(vars.get("updatedNoteVersion")).getTime(); 
    if (updated > created){ 
    SampleResult.setResponseMessage("PASSED"); 
    }else{ 
    SampleResult.setResponseMessage("FAIL"); 
    } 
} 
catch (Exception ex){ 
    log.warn("Error in my script", ex); 
    throw ex; // elsewise JMeter will "swallow" the above exception 
} 

私はdatetime型を解析することができませんし、以下のエラーで立ち往生しかし:

これに追加
java.text.ParseException: Unparseable date: "2017-11-23T15:25:20.154+00:00" 
    at java.text.DateFormat.parse(Unknown Source) ~[?:1.8.0_31] 
    at sun.reflect.GeneratedMethodAccessor77.invoke(Unknown Source) ~[?:?] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_31] 
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_31] 
    at bsh.Reflect.invokeMethod(Reflect.java:134) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.Reflect.invokeObjectMethod(Reflect.java:80) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.Name.invokeMethod(Name.java:858) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHPrimarySuffix.doSuffix(BSHPrimarySuffix.java:103) ~[bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:80) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHVariableDeclarator.eval(BSHVariableDeclarator.java:86) ~[bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHTypedVariableDeclaration.eval(BSHTypedVariableDeclaration.java:84) ~[bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHBlock.evalBlock(BSHBlock.java:130) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHBlock.eval(BSHBlock.java:80) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHBlock.eval(BSHBlock.java:46) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.BSHTryStatement.eval(BSHTryStatement.java:86) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.Interpreter.eval(Interpreter.java:645) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.Interpreter.eval(Interpreter.java:739) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at bsh.Interpreter.eval(Interpreter.java:728) [bsh-2.0b5.jar:2.0b5 2005-06-12 04:50:41] 
    at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source) ~[?:?] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_31] 
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_31] 
    at org.apache.jmeter.util.BeanShellInterpreter.bshInvoke(BeanShellInterpreter.java:166) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.util.BeanShellInterpreter.eval(BeanShellInterpreter.java:189) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.util.BeanShellTestElement.processFileOrScript(BeanShellTestElement.java:151) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.assertions.BeanShellAssertion.getResult(BeanShellAssertion.java:105) [ApacheJMeter_components.jar:3.3 r1808647] 
    at org.apache.jmeter.threads.JMeterThread.processAssertion(JMeterThread.java:812) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.threads.JMeterThread.checkAssertions(JMeterThread.java:803) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:525) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:424) [ApacheJMeter_core.jar:3.3 r1808647] 
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:255) [ApacheJMeter_core.jar:3.3 r1808647] 

私はYYYY-MMなどの通常のdatetime要件のために同じことを達成することができました-DD HH:MM:SS - (2017年11月23日午前15時25分20秒)

誰もがあなたのために、この

+0

15:25:20.041にノートが作成され、15:25:20に更新されてしまうことがありますか?462、後者は小数なしで15:25:20に入っていますか?そうであれば、時間は逆転しているように見えます。とにかくアサーションを渡したいですか?また、時間がまったく同じであれば、アサーションは合格する必要がありますか? –

答えて

0

私の提案のために私を助けることができるが、あなたが長い時代遅れSimpleDateFormatとfrienをあきらめています代わりにjava.time(現代のJava日時API、JSR-310としても知られています)を使用してください。一般的には、作業するのがはるかに良いですし、特定のケースでは、私たちが見るようにいくつかの素晴らしい利点があります。

あなたの質問からdatatimeのバージョン文字列で
String noteVersion = "2017-11-23T15:25:20.154+00:00"; 
    String updatedNoteVersion = "2017-11-23T15:25:22+00:00"; 

    OffsetDateTime created = OffsetDateTime.parse(noteVersion); 
    OffsetDateTime updated = OffsetDateTime.parse(updatedNoteVersion); 
    if (updated.isAfter(created)) { 
     System.out.println("PASSED"); 
    } else { 
     System.out.println("FAILED"); 
    } 

コードスニペットプリント

PASSED 

第一の利点:あなたのJSONからの日時形式がISO 8601、として日付と時刻の情報を交換するための標準フォーマットでありますJSONで頻繁に使用される他の場所のテキストです。 OffsetDateTimeを含むjava.timeクラスは、このフォーマットをデフォルトとして解析します。つまり、明示的なフォーマット指定はありません。オフセットがZまたはXXXなのかどうか心配する必要はありません。

第二の利点:ISO 8601は、時間がミリ秒の有無にかかわらず来るので、解析が以前とあなたの更新日時(SimpleDateFormatを使用すると、2つのSimpleDateFormatのインスタンスを必要としているだろう)の両方で動作することを可能にするために十分柔軟です。

質問:私のJavaバージョンで最新のAPIを使用できますか?

少なくともJava を使用している場合は、可能です。

  • Java 8以降では、新しいAPIが組み込まれています。
  • Java 6および7では、the ThreeTen Backportを取得します。新しいクラスのバックポート(ThreeTenはJSR 310)。
  • Androidでは、Android版のThreeTen Backportを使用してください。それはThreeTenABPと呼ばれ、this question: How to use ThreeTenABP in Android Projectに素晴らしい説明があると思います。
+1

ありがとうございます! それは魅力的に働いた。 –