代码之家  ›  专栏  ›  技术社区  ›  tm1701

在Docker-Maven环境中运行jmeter-Maven插件会导致403个错误

  •  0
  • tm1701  · 技术社区  · 7 年前

    当我在Docker环境中使用Jenkins使用JMeterMaven插件启动JMeter测试时,httpRequests将始终失败,并返回403。 不管接收到的SpringBootApplication是在Docker环境中运行,还是仅仅在我的PC(主机)上运行。 Docker环境是“Docker for Windows”。

    在Windows上的Maven中运行JMeterMaven脚本(没有Docker),然后一切都会顺利运行。也可以在JMeterGUI中运行。

    更新 :

    • 当我将URL更改为无效的URL时,403 HTTP状态将保持不变。更改到无效服务器的路径将继续提供403 HTTP状态。
    • 当我启动jmeter运行(1个线程,2次)时 http://example.com 它起作用了。
    • 在80端口的同一个Docker网络上启动SpringBootApplication也不起作用。都使用 http://localhost http://dockercontainername 使用“非HTTP响应代码:Java.NET.CelpExtExchange,非HTTP响应消息:拒绝连接(连接拒绝)”失败

    我在Windows上准备JMeter脚本文件。我将文件复制到我的SpringMaven项目中。

    我不喜欢在所有环境中安装JMeter,所以使用JMeterMaven插件是一个很好的解决方案。

    你能帮我解决这个很烦人的问题吗?

    我的Maven插件描述是:

    <plugin>
        <groupId>com.lazerycode.jmeter</groupId>
        <artifactId>jmeter-maven-plugin</artifactId>
        <version>2.7.0</version>
        <executions>
            <execution>
                <id>jmeter-tests</id>
                <goals>
                    <goal>jmeter</goal>
                </goals>
                <phase>verify</phase>
            </execution>
        </executions>
        <configuration>
            <skipTests>${skipPerformanceTests}</skipTests>
            <testFilesDirectory>${project.basedir}/src/main/resources/jmeter</testFilesDirectory>
            <resultsDirectory>${project.basedir}/target/jmeter/testFiles</resultsDirectory>
            <resultsFileFormat>csv</resultsFileFormat>
        </configuration>
    </plugin>
    

    我的jmeter脚本:

     <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
      <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments">
          <elementProp name="" elementType="HTTPArgument">
            <boolProp name="HTTPArgument.always_encode">false</boolProp>
            <stringProp name="Argument.value"></stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
            <boolProp name="HTTPArgument.use_equals">true</boolProp>
          </elementProp>
        </collectionProp>
      </elementProp>
      <stringProp name="HTTPSampler.domain"></stringProp>
      <stringProp name="HTTPSampler.port"></stringProp>
      <stringProp name="HTTPSampler.protocol"></stringProp>
      <stringProp name="HTTPSampler.contentEncoding"></stringProp>
      <stringProp name="HTTPSampler.path">http://127.0.0.1:8080/indexRoleA.html</stringProp>
      <stringProp name="HTTPSampler.method">GET</stringProp>
      <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
      <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
      <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
      <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
      <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
      <stringProp name="HTTPSampler.connect_timeout"></stringProp>
      <stringProp name="HTTPSampler.response_timeout"></stringProp>
    </HTTPSamplerProxy>
    

    我的jmeter httpRequets和转到/indexrole.html一样简单。

    2 回复  |  直到 7 年前
        1
  •  0
  •   tm1701    7 年前

    请随时提供比这个更好的答案。至少这是一个很好的“解决方法”。我尝试了所有的组合,包括配置Docker网络等。 如果你有更好的解决方案,请告诉我。

    总之,在Docker容器中启动Jenkins时,jmeter似乎无法连接到我电脑上的另一个(Docker)Spring引导应用程序。

    所以,我从shell启动了SpringBoot应用程序。这工作:

    try { 
      sh "mv target/jenkinstesting-0.1-SNAPSHOT.jar ./jenkingstest.jar"
      sh "nohup java -jar -Dserver.port=8081 ./jenkingstest.jar &"
      sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
    } catch(e) {
      ...
    }
    sh "curl -X GET http://localhost:8081/exit"   // which will exit my application
    sh "rm -f ./jenkingstest.jar"
    

    为什么要使用端口8081?否则我会和其他(开始的)测试工具发生冲突。移动罐子?同样的原因。欢迎有任何改进!

        2
  •  0
  •   tm1701    7 年前

    jmeter测试从maven开始。执行maven 在内部 Jenkins Docker容器,因此使用Docker网络和容器名称是 必修的 .

    因此,解决所需问题:

    • 确定Jenkins容器的网络(用途:Docker Network LS)
    • 运行下一个脚本时,docker容器“under test”被添加到确定的网络中。Docker容器收到一个明确的容器名称。
    • 使用(正在运行的)Docker容器名称的URL执行测试。

    因此,测试是作为一个Jenkinsjob(在Docker容器中)开始的,它包含:

    sh "docker login -u ${env.DOCKER_USERNAME} -p ${env.DOCKER_PASSWORD}"
    sh "docker build -t org/project1:latest ."
    sh "docker run -d -p 8080:8080 --name jenkinsperformacetester --network=docker-compose_default org/project1:latest"
    sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
    

    这是正确的解决方案。我很高兴上面提到的“解决方法”现在被宣布过时了。