2017-04-26 1 views
0

3 개의 다른 HTTP 요청에서 3 개의 변수를 동일한 스레드 그룹으로 인쇄하려고합니다. 나는 JMeter를에 BeanShell이다 다음 썼다 :jmeter Beanshell - 오류 호출 bsh 메서드 : eval

try { 
    hash1 = vars.get("var_Hash_1"); 
    hash2 = vars.get("var_Hash_2"); 
    hash3 = vars.get("var_Hash_3"); 
    FileWriter fstream = new FileWriter("/tmp/result.txt",true); 
    BufferedWriter out = new BufferedWriter(fstream); 
    out.write(hash1); 
    out.write(","); 
    out.write(hash2); 
    out.write(","); 
    out.write(hash3); 
    out.write(","); 
    out.write("\n"); 
    out.close(); 
    fstream.close(); 
} 
catch (Throwable e) { 
    log.error("Errror in Beanshell", e); 
    throw e; 
} 

을 그리고 예외입니다 :

2017년 4월 26일 16시 16분 25초는 WARN - jmeter.extractor.BeanShellPostProcessor : BeanShell이다 스크립트 조직의 문제. apache.jorphan.util.JMeterException : bsh 메소드 호출 오류 : eval 소스 파일 : 인라인 평가 :``{{try {hash1 = vars.get ("var_Hash_1"); hash2 = vars.get ("var_Hash_2"); hash3 = va. . . '': TargetError

뭐죠 intersting입니다 난 단지 hash1 및 hash2 같은 예외가 발생 작성하려고 만의 Result.txt 파일에 기록 뭔가 (hash1, hash2) 는 hash1, hash2, hash3에있는 경우 아무것도 쓰여지지 않습니다.

비슷한 3 가지 요청을 실행하면 성공한 3 가지 변수가 모두 존재해야합니다. 어떤 아이디어?

편집 : 예외에서 로그 파일 :

2017/04/26 17:30:29 ERROR - jmeter.util.BeanShellTestElement: Errror in Beanshell java.lang.NullPointerException 
     at java.io.Writer.write(Writer.java:127) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at bsh.Reflect.invokeMethod(Reflect.java:134) 
     at bsh.Reflect.invokeObjectMethod(Reflect.java:80) 
     at bsh.Name.invokeMethod(Name.java:858) 
     at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75) 
     at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102) 
     at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47) 
     at bsh.BSHBlock.evalBlock(BSHBlock.java:130) 
     at bsh.BSHBlock.eval(BSHBlock.java:80) 
     at bsh.BSHBlock.eval(BSHBlock.java:46) 
     at bsh.BSHTryStatement.eval(BSHTryStatement.java:86) 
     at bsh.Interpreter.eval(Interpreter.java:645) 
     at bsh.Interpreter.eval(Interpreter.java:739) 
     at bsh.Interpreter.eval(Interpreter.java:728) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.apache.jmeter.util.BeanShellInterpreter.bshInvoke(BeanShellInterpreter.java:170) 
     at org.apache.jmeter.util.BeanShellInterpreter.eval(BeanShellInterpreter.java:197) 
     at org.apache.jmeter.util.BeanShellTestElement.processFileOrScript(BeanShellTestElement.java:151) 
     at org.apache.jmeter.extractor.BeanShellPostProcessor.process(BeanShellPostProcessor.java:64) 
     at org.apache.jmeter.threads.JMeterThread.runPostProcessors(JMeterThread.java:750) 
     at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:452) 
     at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261) 
     at java.lang.Thread.run(Thread.java:745) 
+0

코드를 실행했습니다. 파일에 값을 쓸 수있는 것 같습니다. 이 줄만 변경했습니다. FileWriter fstream = new FileWriter ("C : /Projects/result.txt", true); –

답변

1

당신이 try 블록이 이미 주어 - "정상적인"스택 트레이스에 대한 jmeter.log 파일에 보면,이 Error invoking bsh method: eval 쓰레기는 근본 원인에 대한 아무것도 말하지 않는다 . 문제를 직접 파악할 수 없으면 여기에서 끝까지 Errror in Beanshell으로 시작하는 로그 부분을 게시하십시오. 으로 Beanshell 테스트 요소 앞에 Debug Sampler를 배치하여 변수 값을 확인, 당신의 변수의

  1. null (가능성이) 존재로 인해 설정되지 않은 더블 변수를 확인하십시오

    나는 두 가지 이유를 추측 할 수 값은 View Results Tree 수신기에 있습니다.

    1. JMeter를 변수 값을 저장하는 가장 좋은 방법은 사용 :
    2. 당신은 (가능도 가능성이 있지만) 쓰기 /tmp/result.txt 파일에 대한 액세스

    다른 권고 사항의 부부가 없습니다 Sample Variables 속성

  2. 스크립트를 작성해야 할 경우 Beanshell 대신 JSR223 Test Elements and Groovy language을 사용하십시오.
+0

감사합니다. Dmitri, 변수 hash3이 비어 있고 근본 원인 인 것 같습니다. 3 개의 거의 동일한 HTTP 샘플러가 있고, beanshell 스크립트가 스레드 그룹의 끝에 있으면, sampler1과 sampler2에서 변수에 액세스 할 수 있습니다. 알 수없는 이유로 sampler3에서 variable에 액세스 할 수 없습니다. 다른 것을 바꾸지 않고 각 샘플에 3 개의 다른 스크립트를 별도로 배치하면 예외가 없으며 3 가지 변수를 모두 인쇄 할 수 있습니다. –

+0

그래서 Sampler1과 Sampler2는 같은 범위에 있지만 Sampler3은 아닌 것처럼 보입니다. 그들은 모두 같은 이유로 있기 때문에 이유를 이해할 수 없습니다. 스레드 그룹 –

0

여기서 문제는 동일한 샘플러에서 잘못된 순서로 실행되는 두 개의 포스트 프로세서를 사용하고 있다는 것입니다.

  • 샘플러 1
    • 정규식 /으로 Beanshell 추출기
  • 샘플러 2
    • 정규식 /으로 Beanshell 추출기
  • 샘 : 난 당신이 뭔가를 가지고 추정 pler 3
  • 세 번째 샘플러에

으로 Beanshell 포스트 프로세서

  • 정규식 /으로 Beanshell 추출기, 아직 초기화되지 않은 변수에 액세스하려고 제공 한 스크립트 BeanShell이다.

    는 참조 정규식 /으로 Beanshell 추출기 우는으로 Beanshell 포스트 프로세서를 이동해야 또는 요소의 실행 순서에 대한 자세한 정보를 위해 샘플러 3.

    다음에 위치 새로운으로 Beanshell 샘플러에 스크립트를 이동이 문제를 해결하려면 this link. 다음 정규 표현식 추출기의 순서를 확인하지 않으면으로 Beanshell 스크립트 디버깅 샘플러 또는 사용에 다음 코드를 추가하여 값이 있는지 확인하기 위해

  • +0

    안녕하세요 이반, 이런 일이 가능한 원인이 있지만, 내 정규식 추출기/beanshell 시작부터 올바른 순서로 프로세서를 게시했다 –

    +0

    나는 내 대답에서 설치를 시도했습니다. Beanshell과 Regex를 뒤집을 때까지는 작동하지 않습니다. 두 번째 옵션 (Beanshell Sampler 벨로우즈 샘플러에 스크립트 삽입)을 시도 했습니까? –

    0

    확인 당신은 모든 값

    log.info("Hash1 value :"+hash1); 
    
    log.info("Hash2 value :"+hash2); 
    
    log.info("Hash3 value :"+hash3); 
    

    을 얻고있다.

    관련 문제