Hemos generado un proyecto de prueba de karate usando el arquetipo de Maven, para probar varios servicios diferentes API. Tenemos un archivo de función que lleva a cabo una prueba con un punto final, que funciona bien cuando esta variable se ejecuta localmente en nuestra máquina. Sin embargo, nos gustaría realizar estas pruebas de karate en un entorno de CI en el que utilizar una dirección URL a nuestro servicio (desplegado) en un entorno de desarrollo. Cuando nos encontramos mvn clean install
en nuestra línea de CI, obtenemos un error cuando se ejecuta la función:
com.intuit.karate.exception.KarateException:
MyFeatureTest.feature:8 -
java.net.SocketException: Connection reset
nuestra configuración
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>our-karate-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<maven.compiler.version>3.6.0</maven.compiler.version>
<karate.version>0.9.5</karate.version>
</properties>
<dependencies>
<dependency>
<groupId>com.intuit.karate</groupId>
<artifactId>karate-apache</artifactId>
<version>${karate.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.intuit.karate</groupId>
<artifactId>karate-junit4</artifactId>
<version>${karate.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<testResources>
<testResource>
<directory>src/test/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<encoding>UTF-8</encoding>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgument>-Werror</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
</project>
MyFeatureTest.java
import com.intuit.karate.KarateOptions;
import com.intuit.karate.junit4.Karate;
import com.junit.runner.RunWith;
@RunWith(Karate.class)
@KarateOptions(features="classpath:MyFeatureTest.feature")
public class MyFeatureTest {
}
MyFeatureTest.feature
Feature: test an endpoint
Background:
* url 'https://dev.myapplication.com/api/signin'
* configure ssl = true
Scenario: test request
Given request {"username":"john", "password":"doe"}
When method post
Then status 200
And match response == {resp:"success"}
Lo que hemos tratado:
Estamos en condiciones de llamar al servicio a través del cartero sin ningún problema (tanto a nivel local y el servicio desplegado). También hemos intentado ejecutar diferentes métodos, por ejemplo GET. Lo extraño de todo esto es que el error se produce restablecimiento de conexión en nuestro entorno de CI, pero cuando nos encontramos la característica localmente, tenemos una org.apache.http.conn.ConnectTimeoutException: connect to https://dev.myapplication.com:443 failed: connection timeout
.
Tenemos la sensación de que está relacionado con el karate-Apache cliente, sino que también hemos tratado de utilizar Apache-Jersey. Por desgracia, tenemos el mismo problema cuando se utiliza el cliente de punto y. También nos pareció que podría estar relacionado con SSL. Sin embargo, incluso cuando se utiliza un servicio no ssl (y eliminar la configuración de SSL de la característica), el mismo problema se produce. Hemos tratado de respuestas de la prueba de que no sea HTTPS sitios web como web.archive.org, así como los https como google.com, en un intento inútil y en el que basta con probar una petición GET. Sin embargo, el mismo problema se produce.
Se parece mucho a que tienen un proxy HTTP que tratar.
Consulte los documentos, si ese es el caso: https://github.com/intuit/karate#configure
* configure proxy = 'http://my.proxy.host:8080'