Test if a request/response matches a given raml definition

Overview

raml-tester

Build Status codecov License

Test if a request/response matches a given raml definition.

Versioning

Version Contents
0.8.x Stable version, uses RAML parser 0.8.x and supports only RAML v0.8
0.9.x Development version, uses RAML parser 1.x and supports RAML v0.8 and parts of v1.0
1.0.x As soon as RAML v1.0 support is stable

Add it to a project

Add these lines to the pom.xml:

<dependency>
    <groupId>guru.nidi.raml</groupId>
    <artifactId>raml-tester</artifactId>
    <version>0.8.8</version>
</dependency>

If you are stuck with java 1.6, use the compatible version by adding the following line:

    <classifier>jdk6</classifier>

Use in a spring MVC test

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Application.class)
public class SpringTest {

    private static RamlDefinition api = RamlLoaders.fromClasspath(SpringTest.class).load("api.raml")
            .assumingBaseUri("http://nidi.guru/raml/simple/v1");
    private static SimpleReportAggregator aggregator = new SimpleReportAggregator();

    @ClassRule
    public static ExpectedUsage expectedUsage = new ExpectedUsage(aggregator);

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    public void greeting() throws Exception {
        Assert.assertThat(api.validate(), validates());

        mockMvc.perform(get("/greeting").accept(MediaType.parseMediaType("application/json")))
                .andExpect(api.matches().aggregating(aggregator));
    }
}

The ExpectedUsage rule checks if all resources, query parameters, form parameters, headers and response codes defined in the RAML are at least used once.

The RamlMatchers.validates() matcher validates the RAML itself.

api.matches() checks that the request/response match the RAML definition.

See also the raml-tester-uc-spring project.

Use in a Java EE / JAX-RS environment

@RunWith(Arquillian.class)
public class JaxrsTest {

    private static RamlDefinition api = RamlLoaders.fromClasspath(JaxrsTest.class).load("api.raml")
            .assumingBaseUri("http://nidi.guru/raml/simple/v1");
    private static SimpleReportAggregator aggregator = new SimpleReportAggregator();
    private static WebTarget target;

    @ClassRule
    public static ExpectedUsage expectedUsage = new ExpectedUsage(aggregator);

    @Deployment(testable = false)
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class).addClass(Application.class);
    }

    @ArquillianResource
    private URL base;

    @Before
    public void setup() throws MalformedURLException {
        Client client = ClientBuilder.newClient();
        target = client.target(URI.create(new URL(base, "app/path").toExternalForm()));
    }

    @Test
    public void greeting() throws Exception {
        assertThat(api.validate(), validates());

        final CheckingWebTarget webTarget = api.createWebTarget(target).aggregating(aggregator);
        webTarget.request().post(Entity.text("apple"));

        assertThat(webTarget.getLastReport(), checks());
    }
}

The RamlMatchers.checks() matcher validates that the request and response conform to the RAML.

Use in a pure servlet environment

public class RamlFilter implements Filter {
    private final Logger log = LoggerFactory.getLogger(getClass());
    private RamlDefinition api;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        api = RamlLoaders.fromClasspath(getClass()).load("api.yaml");
        log.info(api.validate().toString());
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        final RamlReport report = api.testAgainst(request, response, chain);
        log.info("Raml report: " + report);
    }

    @Override
    public void destroy() {
    }
}

Or see the raml-tester-uc-sevlet project.

Use together with Apache HttpComponents

public class HttpComponentsTest {
    @Test
    public void testRequest() throws IOException {
        RamlDefinition api = RamlLoaders.fromClasspath(getClass()).load("api.yaml");
        Assert.assertThat(api.validate(), validates());

        RamlHttpClient client = api.createHttpClient();
        HttpGet get = new HttpGet("http://test.server/path");
        HttpResponse response = client.execute(get);

        Assert.assertThat(client.getLastReport(), checks());
    }
}

Or see the raml-tester-uc-servlet project.

Use together with RestAssured

public class RestAssuredTest {
    @Test
    public void testWithRestAssured() {
        RestAssured.baseURI = "http://test.server/path";
        RamlDefinition api = RamlLoaders.fromClasspath(getClass()).load("api.yaml");
        Assert.assertThat(api.validate(), validates());

        RestAssuredClient restAssured = api.createRestAssured();
        restAssured.given().get("/base/data").andReturn();
        Assert.assertTrue(restAssured.getLastReport().isEmpty());
    }
}

If you are using RestAssured 3.0, call api.createRestAssured3().

Use as a standalone proxy

When used as a proxy, any service can be tested, regardless of the technology used to implement it. See the raml-proxy project.

Use with Javascript

There is special support for javascript.

See raml-tester-js for details and raml-tester-uc-js for examples.

FailFast

You can configure the RamlDefinition to throw an exception in case a violation is found.

@Test(expected = RamlViolationException.class)
public void testInvalidResource() {
    RestAssured.baseURI = "http://test.server/path";
    RamlDefinition api = RamlLoaders.fromClasspath(getClass()).load("api.yaml");
    Assert.assertThat(api.validate(), validates());

    RestAssuredClient restAssured = api.failFast().createRestAssured();
    restAssured.given().get("/wrong/path").andReturn();
    fail("Should throw RamlViolationException");
}
Comments
  • Support RAML 1.0

    Support RAML 1.0

    RAML 1.0 is about to be finalized, as announced here: http://blog.raml.org/raml-1-0-final-candidate/

    The blog post shows examples of what's new and coming in 1.0, which is a good start to start thinking/preparing support for it in RAML Tester :wink:

    opened by ddossot 18
  • Requests violations are reported for headers defined in security scheme

    Requests violations are reported for headers defined in security scheme

    RAML Tester reports request violations for requests that contain headers even if they are specified in the describedBy map of the custom security scheme.

    It would be nice to recognize these headers and not report request violations.

    opened by ddossot 9
  • Testing apps with a servlet-per-resource fails

    Testing apps with a servlet-per-resource fails

    We've been using (or trying to use) raml-tester for two different projects. It's working great on one project, but we're having troubles with the second project. The first project uses Jersey, so there's a single servlet, mapped to /api, with all the resources served up via it, eg /api/someApiResource. This works fine.

    The project we have trouble with is a legacy project, that has a servlet per resource. Because of this, there is no path-info on requests to the resources. That's causing problems with this code from ServletRamlRequest:

        @Override
        public String getRequestUrl(String baseUri) {
            return baseUri == null
                    ? request().getRequestURL().toString()
                    : (baseUri + request().getPathInfo());
        }
    

    This results in "baseUrinull" as the requestUrl. Because of this, raml-tester is unable to match any of the resources being requested by our API tests.

    I'm not sure what the best solution to this is, but I wondered if returning request().getRequestURL().toString() when path-info is null would do the trick safely?

        @Override
        public String getRequestUrl(String baseUri) {
            String pathInfo = request().getPathInfo();
            return baseUri == null || pathInfo == null
                    ? request().getRequestURL().toString()
                    : (baseUri + pathInfo);
        }
    

    I've verified that the above change passes a mvn clean install, at least, and seems to fix our usecase.

    opened by lewisd32 8
  • Issue in mime sub-type compatibility test

    Issue in mime sub-type compatibility test

    I'm facing a problem where:

    application/vnd.unbounce.test.v1+json
    

    is not detected as being compatible with:

    application/json
    

    although it should.

    Because of this issue, I receive:

    No SchemaValidator found for media type 'application/vnd.unbounce.test.v1+json'
    

    Playing with guru.nidi.ramltester.util.MediaType, I indeed see that:

    MediaType
        .valueOf("application/vnd.unbounce.test.v1+json")
        .isCompatibleWith(MediaType.valueOf("application/json"))
    

    returns false, which prevents the RestassuredSchemaValidator to be picked.

    It would be great if this issue could be fixed.

    opened by ddossot 8
  • Validation results as POJOs instead of String

    Validation results as POJOs instead of String

    Hi there,

    In my case, I'm using raml-tester to validate requests against my raml not only for tests but also in runtime (by implementing a filter), so the output of this validation becomes the response for the client. The issue is that the response is not that good for a REST API. For instance:

    Body does not match schema for action(POST /organizations/{organizationId}/projects) mime-type('application/json') Content: { "description": "description", "type": "type" } Message: error: object has missing required properties (["name"]) level: "error" schema: {"loadingURI":"#","pointer":""} instance: {"pointer":""} domain: "validation" keyword: "required" required: ["description","name","type"] missing: ["name"]

    I wonder if it could be possible change the ValidationResults to be a set of POJOs - or something like that - so I can prepare a more elegant response or at least do something else with them, which is uncomfortable to do with these strings. I guess a POJO like com.github.fge.jsonschema.core.report.ProcessingMessage would be enough.

    opened by arielsegura 7
  • Cannot resolve relative schema references in JSON schemas

    Cannot resolve relative schema references in JSON schemas

    We have a RAML file that references some JSON schema files, and one of the JSON schema files references another JSON schema file. The latter reference cannot be resolved by the JSON schema validator - even when we pass in a custom loader to SchemaValidators.withloader to resolve such references (the custom loader is never called).

    opened by greenrd 7
  • !include ignored in resource type parameters

    !include ignored in resource type parameters

    If I pass an included file to a resource type, like this:

    exampleCollection: !include example/sites.json
    

    then when validating the RAML, instead of reading the file example/sites.json, it just behaves as if the !include keyword wasn't there, and tries to parse the filename as if it were JSON.

    Here is the relevant part of the stacktrace:

      [1] com.fasterxml.jackson.core.base.ParserMinimalBase._reportError (ParserMinimalBase.java:533)
      [2] com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken (ReaderBasedJsonParser.java:2,462)
      [3] com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue (ReaderBasedJsonParser.java:1,621)
      [4] com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken (ReaderBasedJsonParser.java:689)
      [5] com.fasterxml.jackson.databind.MappingIterator.hasNextValue (MappingIterator.java:240)
      [6] com.github.fge.jackson.JsonNodeReader.readNode (JsonNodeReader.java:142)
      [7] com.github.fge.jackson.JsonNodeReader.fromReader (JsonNodeReader.java:127)
      [8] com.github.fge.jackson.JsonLoader.fromReader (JsonLoader.java:179)
      [9] com.github.fge.jackson.JsonLoader.fromString (JsonLoader.java:192)
      [10] com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesSafely (JsonSchemaValidator.java:214)
      [11] com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesSafely (JsonSchemaValidator.java:75)
      [12] org.hamcrest.TypeSafeMatcher.matches (TypeSafeMatcher.java:65)
      [13] guru.nidi.ramltester.validator.RestassuredSchemaValidator.validate (RestassuredSchemaValidator.java:97)
      [14] guru.nidi.ramltester.core.RamlValidatorChecker.exampleSchema (RamlValidatorChecker.java:275)
      [15] guru.nidi.ramltester.core.RamlValidator.mimeType (RamlValidator.java:117)
      [16] guru.nidi.ramltester.core.RamlValidator.action (RamlValidator.java:102)
      [17] guru.nidi.ramltester.core.RamlValidator.resource (RamlValidator.java:85)
      [18] guru.nidi.ramltester.core.RamlValidator.validate (RamlValidator.java:66)
      [19] guru.nidi.ramltester.RamlDefinition.validate (RamlDefinition.java:122)
    

    This is with raml-tester 0.8.4.

    opened by greenrd 6
  • Update raml-parser version to 0.8.21

    Update raml-parser version to 0.8.21

    @nidi3 This PR just updates the raml-parser version.

    Note that raml-parser version 0.8.17 depends on json-schema-validator version 2.2.6 and version 0.8.21 depends on version 2.2.8.

    2.2.8 and 2.2.6 are not binary compatible due to a final class being changed to an interface.

    If you get a chance to review this PR and it ends up getting merged in, then I'd appreciate it if you were able to cut a new version of raml-tester with this change.

    opened by ismail-s 5
  • Sources updated so it can compile and run against JDK6.

    Sources updated so it can compile and run against JDK6.

    Hi,

    This pull request contains the changes that are necessary to compile against JDK6. It also requires the pull request for the parent pom where the source level is set to java 1.6. It was quite straight forward for make these changes as the biggest changes were only the diamond operator and the "try with resources".

    opened by dsteegen 4
  • Accept header check doesn't support `*/*`

    Accept header check doesn't support `*/*`

    We've tried upgrading to RAML tester 0.8.2 but have many tests failing because the new Accept header test doesn't cater to */*.

    Example (only relevant parts are kept):

    {
        "requestHeaders": {
            "Accept": [
                "*/*"
            ]
        },
        "responseHeaders": {
            "Content-Type": [
                "application/json; charset=UTF-8"
            ]
        },
        "responseViolations": [
            "Response Content-Type 'application/json; charset=UTF-8' is not compatible with Accept header '*/*'"
        ]
    }
    

    The specification of the Accept header allows complex expressions like: Accept: audio/*; q=0.2, audio/basic. Thus, IMO, if RAML Tester decides to enforce Accept/Content-Type validity, it has to fully support Accept's spec (FWW I'm using the Java helper in this library for that intent in some of my apps).

    opened by ddossot 4
  • Repeated query parameters yied IllegalArgumentException

    Repeated query parameters yied IllegalArgumentException "Unhandled parameter value"

    Using version 0.8.5, with a RestAssured request like:

    given().get("/things?id=1&id=2&id=3").then().assertThat().statusCode(is(200)));
    

    I get:

    java.lang.IllegalArgumentException: Unhandled parameter value '[1,2,3]' of type class java.util.ArrayList
        at guru.nidi.ramltester.core.ParameterChecker.checkParameter(ParameterChecker.java:192)
        at guru.nidi.ramltester.core.ParameterChecker.checkListParameters(ParameterChecker.java:140)
        at guru.nidi.ramltester.core.ParameterChecker.checkExtendedParameters(ParameterChecker.java:121)
        at guru.nidi.ramltester.core.ParameterChecker.checkParameters(ParameterChecker.java:103)
        at guru.nidi.ramltester.core.RamlChecker.checkQueryParameters(RamlChecker.java:166)
        at guru.nidi.ramltester.core.RamlChecker.checkRequest(RamlChecker.java:129)
        at guru.nidi.ramltester.core.RamlChecker.check(RamlChecker.java:66)
        at guru.nidi.ramltester.restassured.RamlValidationFilter.filter(RamlValidationFilter.java:41)
        at com.jayway.restassured.filter.Filter$filter.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at com.jayway.restassured.filter.Filter$filter$0.call(Unknown Source)
        at com.jayway.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:71)
        at com.jayway.restassured.filter.FilterContext$next.call(Unknown Source)
        at com.jayway.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1466)
        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:497)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:810)
        at com.jayway.restassured.internal.RequestSpecificationImpl.invokeMethod(RequestSpecificationImpl.groovy)
        at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:48)
        at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:58)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:182)
        at com.jayway.restassured.internal.RequestSpecificationImpl.get(RequestSpecificationImpl.groovy:151)
        at com.jayway.restassured.internal.RequestSpecificationImpl.get(RequestSpecificationImpl.groovy)
    

    I've step-debugged in ParameterChecker.checkListParameters and found that entry at:

    for (final Object value : entry.getValue()) {
    

    contains a List of List, i.e. it is: {id=[[1,2,3]]} where, I think, only a list was expected.

    opened by ddossot 3
  • RAML API with Hawk authentication

    RAML API with Hawk authentication

    I am trying to write tests to validate RAML API's which are secured with hawk authentication mechanism. does raml-tester supports hawk authentication? if yes could you please help me out to understand how does it work.

    opened by yogiraj84 0
  • Adding more response header to ignore

    Adding more response header to ignore

    Is there a way to add more response headers to ignore? I would like to ignore the response header "Referrer-Policy" that is added by a gateway. I looked at this class RamlChecker and there is a predefined DefaultHeaders.RESPONSE.

    For X headers there is RamlDefinition.ignoringXheaders(). In the same way I would like to know if its possible something like that but to "Referrer-Policy".

    opened by eacarvalho 0
  • "Unrecognized token 'object': expecting true, false or null" describing json response

    Hello, I am using raml-tester 0.9.1 to unit-test my API backend. This is the raml document:

    #%RAML 1.0
    title: example REST API
    baseUri: http://localhost:8080/exampleBackend
    version: 1.0
    mediaType: application/json
    /status:
      description: Reports the backend status and configuration
      get:
        responses:
          200:
            body:
              application/json:
                type: object
                properties:
                  version:
                    type: string
                    description: application version
                  frontendConfigFilename:
                    type: string
                    description: frontend configuration file
                  baseApiUrl:
                    description: base url
                    type: string
                  listeningIPaddress:
                    description: IP address
                    type: string
                  listeningPort:
                    description: TCP port
                    type: number
                  deployedVerticlesNumber:
                    description: deployed verticles
                    type: number
                  workerPoolSize:
                    description: worker pool size
                    type: number
                  clustered:
                    description: clustered option value
                    type: boolean
                    required: false
    

    However, when I run the test:

    checking.path(config.getBaseApiUrl()+"/status").request().get();
    Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
    

    It fails with this output:

    java.lang.AssertionError: 
    Expected: To be empty
         but: 
    Response violations:
      - Body does not match schema for action(GET /status) response(200) mime-type('application/json')
        Content: {
          "Frontend_config_filename" : "frontend.properties",
          "Version" : "UNKNOWN",
          "Base_API_url" : "/exampleBackend",
          "Listening_IP_address" : "0.0.0.0",
          "Listening_port" : 8080,
          "Deployed_verticles_number" : 1,
          "Worker pool size" : 1,
          "Clustered" : false
        }
        Messages:
        - Schema invalid: Unrecognized token 'object': was expecting ('true', 'false' or 'null')
         at [Source: Inline schema definition; line: 1, column: 13]
    

    Ignoring the fact that the error messages are "poorly documented" to say the least, I don't understand what is wrong in my schema, and I suspect it has something to do with the parser instead. Any idea?

    opened by marcosox 4
  • Multiple URI parameters not recognized

    Multiple URI parameters not recognized

    Does the raml-tester support multiple URI parameters for the same resource? I have the following endpoint that defines two URI parameters in its path:

    /Messages:
      /{MessageId}{mediaTypeExtension}:
        uriParameters:
          MessageSid:
            type: string
            required: true
          mediaTypeExtension:
            enum: [ .json, .xml ]
            type: string
            required: false
    

    However, the validation fails with the error below:

    Resource '/Messages/12345.json' is not defined
    

    If I remove the {mediaTypeExtension}, the validation passes.

    opened by urbanusjam 0
Releases(raml-tester-0.8.2)
Owner
Stefan Niederhauser
Born and still alive
Stefan Niederhauser
Intercept network request by running Selenium tests with JUnit on LambdaTest cloud.

Run Selenium 4 Tests With JUnit On LambdaTest Blog ⋅ Docs ⋅ Learning Hub ⋅ Newsletter ⋅ Certifications ⋅ YouTube       Learn how to use JUnit framewor

null 11 Jul 11, 2022
JUnit 5 Parameterized Test Yaml Test Data Source

Yamaledt — JUnit 5 Parameterized Tests Using Yaml and Jamal Introduction and usage Note This is the latest development documentation. This is a SNAPSH

Peter Verhas 4 Mar 23, 2022
Test Automation Made Simple

Karate Test Automation Made Simple. Karate is the only open-source tool to combine API test-automation, mocks, performance-testing and even UI automat

Intuit 6.5k Dec 28, 2022
Serenity BDD is a test automation library designed to make writing automated acceptance tests easier, and more fun.

That feeling you get when you know you can trust your tests Serenity BDD is a library designed to make writing automated acceptance tests easier, and

Serenity BDD 654 Dec 28, 2022
A library for setting up Java objects as test data.

Beanmother Beanmother helps to create various objects, simple and complex, super easily with fixtures for testing. It encourages developers to write m

Jaehyun Shin 113 Nov 7, 2022
A Java architecture test library, to specify and assert architecture rules in plain Java

ArchUnit is a free, simple and extensible library for checking the architecture of your Java code. That is, ArchUnit can check dependencies between pa

TNG Technology Consulting GmbH 2.5k Jan 2, 2023
PowerMock is a Java framework that allows you to unit test code normally regarded as untestable.

Writing unit tests can be hard and sometimes good design has to be sacrificed for the sole purpose of testability. Often testability corresponds to go

PowerMock 3.9k Dec 28, 2022
FitNesse -- The Acceptance Test Wiki

FitNesse Welcome to FitNesse, the fully integrated stand-alone acceptance testing framework and wiki. To get started, check out http://fitnesse.org! Q

Robert C. Martin 1.9k Jan 3, 2023
PowerMock is a Java framework that allows you to unit test code normally regarded as untestable.

Writing unit tests can be hard and sometimes good design has to be sacrificed for the sole purpose of testability. Often testability corresponds to go

PowerMock 3.9k Dec 28, 2022
Enabling Test Automation in Java

SeLion Enabling Test Automation in Java SeLion builds on top of TestNG and Selenium to provide a set of capabilities that get you up and running with

PayPal 268 Dec 11, 2022
Arbitrary test data generator for parameterized tests in Java inspired by AutoFixture.

AutoParams AutoParams is an arbitrary test data generator for parameterized tests in Java inspired by AutoFixture. Sometimes setting all the test data

null 260 Jan 2, 2023
A simple yet powerful parameterized test runner for Java.

TestParameterInjector Introduction TestParameterInjector is a JUnit4 test runner that runs its test methods for different combinations of field/parame

Google 324 Dec 30, 2022
Extensions/Plugins for JVM test frameworks

Jexter Extensions/Plugins for JVM test frameworks (JUnit 4, JUnit 5, ...) Get Jexter Binaries are available from Maven Central. Group Artifact Latest

Thundra 20 Jul 26, 2022
Let Fixture Monkey generate test instances including edge cases automatically

Fixture Monkey is designed to generate controllable arbitrary instances easily. It allows you to reuse same configurations of the instances in several tests.

NAVER 247 Jan 9, 2023
Never debug a test again: Detailed failure reports and hassle free assertions for Java tests - Power Asserts for Java

Scott Test Reporter for Maven and Gradle Get extremely detailed failure messages for your tests without assertion libraries, additional configuration

Dávid Csákvári 133 Nov 17, 2022
A BDD-style test runner for Java 8. Inspired by Jasmine, RSpec, and Cucumber.

Spectrum A colorful BDD-style test runner for Java Spectrum is inspired by the behavior-driven testing frameworks Jasmine and RSpec, bringing their ex

Greg Haskins 143 Nov 22, 2022
Gatling is a load test tool. It officially supports HTTP, WebSocket, Server-Sent-Events and JMS.

Gatling What is Gatling ? Gatling is a load test tool. It officially supports HTTP, WebSocket, Server-Sent-Events and JMS. Motivation Finding fancy GU

Gatling 5.8k Dec 27, 2022
Test Automation Made Simple

Karate Test Automation Made Simple. Karate is the only open-source tool to combine API test-automation, mocks, performance-testing and even UI automat

Karate Labs 6.5k Dec 31, 2022