Forum Discussion

kenm's avatar
kenm
Contributor
8 years ago

Best approach to testing async API calls?

Good afternoon all,

 

First post so please be gentle  :)

 

Just to give a little context... we're in the process of testing APIs that perform operations asynchronously. Naturally, from a test perspective we need to verify that the asynchronous request has ultimately performed it's desired operation correctly. At present we're just using arbitrary delays awaiting these things to happen but this is far from ideal and adds a level of unreliability to the tests.

 

i.e.

1. Rest API call - Giving me a request ID response

2. Delay for X seconds

3. Rest API call - Check status of request ID and should have a JSON attribute indicating success/failure/pending

4. Rest API - Do next operation

etc.

 

What'd like to do is replace step "2 Delay for X seconds" either with... retry step 3 checking the status every Z seconds for a period of Y and do not fail.

 

Or another approach that meets the needs... we have Soap UI NG Pro in use.

 

All approaches, suggestions, thoughts welcomed... we haven't dug through all Soap UI NG Pro documentation yet so apologies if it's something obvious in there but haven't seen something that'll meet the need yet.

 

Appreciate any help! Thanks.

Ken.

  • Radford's avatar
    Radford
    Super Contributor

    While I would not want to say this is the best way, I do something similar to what you are asking. I do the following:

     

    1. Make Initial Call
    2. Delay Step
    3. Make Status Check Call (has the async call completed?)
    4. Groovy TestStep with code to check the output from step 3 and if the async call is not completed/as expected, go back to the delay step and repeat. I also put in a max retry limit to stop things from getting stuck into an infinite loop should something go wrong.
    5. Validate results are as expected.

     

    You can then tweak the delay time and the amount of retrys to suit you situation.

     

    In real world cases I usually put steps 2,3 & 4 into a separate "common library" test case thus keeping the actual test case a bit cleaner and making the steps to check reusable (as I usually find I'll want to make multiple step 1 "Make Initial Call" with subtly different inputs, that just need slightly different validations in step 5).

    • kenm's avatar
      kenm
      Contributor

      Thanks Radford!

      That would work perfectly in my context, my Groovy skills are on the novice side at present.

       

      Don't suppose you'd be able to share your script/a sanitised version to give me a step up? Appreciate it.

      Ken

      • Radford's avatar
        Radford
        Super Contributor

        While I don't have scripts I can share easily at hand, there are a couple of things I can point out with regard to interacting with Ready API to help you on your way.

         

        Firstly have you seen Groovy script Get Data functionality? This will allow you to get data from a previous step using the GUI. This will help you learn the corrrect syntax.

         

        Secondly, you'll see that Groovy test steps provide the script with among others a variable called testRunner this provides several methods of interest to you:

         

        testRunner.gotoStepByName("Test Case Name")

         

         

        This will allow you to transfer execution to another named test step within the current test case, and

         

        testRunner.fail("Insert your fail reason here.")

         

         

        This will allow you fail a test for whatever reason you chose, for example if you've reached your self defined retry limit.

         

        Note: If you're just beginning with Groovy scripting, perhaps someone else may be able to offer a better non-Groovy alternative to your question.