API Testing Made Easy
            
            
            
              Video size:
              
              
            
            
           
          
            
              Abstract
            
Join me for a deep dive into API testing! I’ll cover the importance of testing APIs for software quality and reliability, different types of API testing, tips for writing effective test cases and data mocks. Don’t miss this opportunity to learn more about this crucial aspect of software development.
           
          
          
          
            
              Summary
            
            
              
              - 
                Barkatul Mujauddin is a developer relation intern at Keploy. He believes that there are many problems in developers job and the root of maximum problems are strict timelines. All we need to reduce the bugs are just three things. We need a tool that could create the test cases and update them easily for us.
              
 
              
              - 
                Record and replay approach. Record the traffic from production and replay it in a non production environment. This approach is good for load testing or stress testing, but not suitable for functional testing. Kipploy does keploy what basically converts your API to a virtual database.
              
 
              
              - 
                I hope you have understood how keploy works. You can also find us on GitHub and if you want you can star us. Also, feel free to join our slack channel. We would love to have all of you in our community.
              
 
              
            
           
          
            
              Transcript
            
            
              This transcript was autogenerated. To make changes, submit a PR.
            
            
            
            
              Hello and welcome everyone. My name is Barkatul Mujauddin
            
            
            
              and I'm excited to be here today to talk about API
            
            
            
              testing made easy. I hope you are all having a great day so far
            
            
            
              and are looking forward to learning something new. Thank you for taking the
            
            
            
              time me to join me today. So here's a quick introduction.
            
            
            
              About me I am a developer relation intern at Keploy. I am
            
            
            
              a GSOC 2023 mentor this year only and
            
            
            
              I am also the founder of a community called Hack for Code.
            
            
            
              I am also a kubesimplifier ambassador which I'm really proud of.
            
            
            
              I believe that there are many problems
            
            
            
              in developers job and the root of maximum problems are
            
            
            
              strict timelines. Let me tell you how with an example.
            
            
            
              Yes, you guessed it right, the example is related to
            
            
            
              API testing. So here's a situation. Due to a strict
            
            
            
              timeline, we may have limited time to perform testing
            
            
            
              which can lead to regressions. Right? Again, this is
            
            
            
              a problem. So as we all know, for every
            
            
            
              problem there is a solution. All we need to reduce
            
            
            
              the bugs are just three things. Number one, we need
            
            
            
              to do the functional testing. We need a tool that
            
            
            
              could create the test cases and update the test cases easily
            
            
            
              for us so that we don't have to really write the
            
            
            
              test cases and spend time on it. We need something that could automatically
            
            
            
              orchestrate the testing infrastructure. So that's
            
            
            
              all we need. Now let's look
            
            
            
              at what if we can record the
            
            
            
              traffic from production and we can replay it in a
            
            
            
              non production environment. I know this is kind of something overwhelming
            
            
            
              and out of context, so let me explain it to you.
            
            
            
              So here's the thing. Think it in this way.
            
            
            
              This is an application serving the user traffic. Let's say application v one.
            
            
            
              And first we captured the user traffic from
            
            
            
              production. Then we replayed it after setting up
            
            
            
              the shadow database of the snapshot database. And then we
            
            
            
              need to write to compare the responses. Obviously this requires
            
            
            
              a huge operational effort because we first write to record,
            
            
            
              then we need to set up those snapshot database which are expensive,
            
            
            
              and then we need to update these snapshots timely.
            
            
            
              And then we need to write to compare the responses as well.
            
            
            
              So it is a pretty wise strategy,
            
            
            
              but it's expensive and it's included a lot of
            
            
            
              effort so far in
            
            
            
              this approach. The record and replay approach.
            
            
            
              Let's discuss some of the pros and cons we are
            
            
            
              discussing about the pros. The first one is it is a low code
            
            
            
              approach and you don't really have to write the test cases.
            
            
            
              It is easy to achieve high coverage because you
            
            
            
              are capturing the user traffic, so there are multiple
            
            
            
              flows that you are capturing and will be able to replay,
            
            
            
              which increases the coverage of the code base that
            
            
            
              your application or your API test are going through.
            
            
            
              The third one is sometimes there are unexpected user flows that
            
            
            
              you discover just via the real user traffic that
            
            
            
              the developer never did code for, but they discovered
            
            
            
              it from the real world. If we are
            
            
            
              discussing about the cons, then the first cons
            
            
            
              are the dependency states are hard to manage.
            
            
            
              This approach is good for load testing or stress testing,
            
            
            
              but not suitable for functional testing because if
            
            
            
              some of the APIs fail, there are multiple user traffic
            
            
            
              calls that fail and you have to go to each of
            
            
            
              the call and debug it. So that takes a lot of
            
            
            
              effort and a lot of time to debug and it
            
            
            
              causes a lot of frustration as well. The third cons are
            
            
            
              handling writes is always tricky in this approach.
            
            
            
              So let's come back. We were doing a record keploy
            
            
            
              via snapshot database from a production environment to
            
            
            
              a non production environment. So let's think it in this way.
            
            
            
              If you are capturing and replaying the API request and response,
            
            
            
              how about we also do the same for the database
            
            
            
              queries? So what if we
            
            
            
              create a virtual database which is just the database
            
            
            
              query request and response and not a complete database?
            
            
            
              I'll show you a deep dive with an example later in this talk. But in
            
            
            
              this approach also, there are some downsides.
            
            
            
              Like you have to add support
            
            
            
              for each of the dependencies, right, that your application is talking
            
            
            
              to. For example, if your application is talking to MongoDB,
            
            
            
              then you need to add support mocks the MongoDB queries
            
            
            
              or to capture
            
            
            
              and replay that. This becomes brittle in case your API
            
            
            
              schema completely changes and you have to rerecord
            
            
            
              the user traffic and replay it. So these are
            
            
            
              the downsides. But the upsides are the
            
            
            
              complete database did not need to be replicated
            
            
            
              to some other environment, or neither. It is expensive because
            
            
            
              we were storing just the query data.
            
            
            
              So what we just discussed, we are going to
            
            
            
              basically virtualize that. So to
            
            
            
              give an example, let's say in an application,
            
            
            
              if we request an API with a particular user,
            
            
            
              it returns what sports that particular user plays.
            
            
            
              So the user has Thompson and we got the response as
            
            
            
              cricket, volleyball, karam and boxing.
            
            
            
              So in this case we have the application talking
            
            
            
              to MongoDB, which has all of the relevant data.
            
            
            
              Typically if I am going to record replay into
            
            
            
              a different environment, I would capture
            
            
            
              the request, run it again in my test environment,
            
            
            
              and this time maybe user Thompson isn't there.
            
            
            
              What I mean to say is it's not the same state.
            
            
            
              So the problem is how do we ensure
            
            
            
              that the exact state is consistent
            
            
            
              with the test case that we captured.
            
            
            
              Now in the same example,
            
            
            
              if once we do dependency mocking, we can instead
            
            
            
              of maintaining the test database, we instead
            
            
            
              kind of maintain a mock. So when we
            
            
            
              capture the Getgame request, we capture the queries
            
            
            
              and the response that we got from MongoDB and just
            
            
            
              package it along the test case. So now
            
            
            
              when the same thing happens while we are
            
            
            
              testing, we can just return the same response that
            
            
            
              we got for the particular request. So it's basically mocking,
            
            
            
              but actually kind of replaying that exact database
            
            
            
              response that we captured and then of course
            
            
            
              things will be consistent.
            
            
            
              So as of now, we have
            
            
            
              discussed the problems we were facing right now as a
            
            
            
              developer and how record, replay and dependency approach can solve
            
            
            
              these problems. So what
            
            
            
              basically Kipployoy does is keploy converts your API cases
            
            
            
              to test cases automatically.
            
            
            
              All you just need to integrate keploy in your application and
            
            
            
              it automatically mocks external dependencies for you.
            
            
            
              It also detects the noise and accurately reduce it
            
            
            
              automatically. All of these three can be done by keploy
            
            
            
              easily. How? Let me show you a demo.
            
            
            
              Let me show you a demo of how keploy can
            
            
            
              generate test cases as well as data mocks for your backend
            
            
            
              application. So in the demo I will take
            
            
            
              a Javasample application which is an employee management application
            
            
            
              and it does a crude operation on employee. So this
            
            
            
              is the main repository of keploy where the server lies. You can just
            
            
            
              simply install it. Now I'm going to follow the samples Java repository.
            
            
            
              So I have already installed keploy server and I'm
            
            
            
              going to start it. And I have also cloned the sample Java application
            
            
            
              here. Now to integrate the Keploy Java SDK with
            
            
            
              my application I need to follow certain steps.
            
            
            
              First I need to add the keploy dependency. So I have added
            
            
            
              it here. Then I need to also import
            
            
            
              the keploy middleware with my main class. I have done that here and
            
            
            
              I also need to have the agent jar. So how
            
            
            
              you can go to it is to going to maven central
            
            
            
              download the latest version of this agent jar and
            
            
            
              put it in the main directory of your application.
            
            
            
              Now the last thing I need to do is to set up this agent.
            
            
            
              I have just added the vm
            
            
            
              options as Java agent and then gave the absolute path to
            
            
            
              this agent jar. And I have now added
            
            
            
              the environment variable which is keploy
            
            
            
              mode record because I'm going to make
            
            
            
              API cases and record
            
            
            
              the test cases. And denoise is true, it just means that
            
            
            
              it is going to ignore all the random fields like timestamps or random
            
            
            
              numbers which are going to change in every API call. Now let's go
            
            
            
              ahead and run our postcase instance first.
            
            
            
              So I'm just going to run the postgres instance.
            
            
            
              It is running now and I'm going to start the sample application.
            
            
            
              Now let's just go ahead and make an API call.
            
            
            
              So I have this post API call which adds an
            
            
            
              employee record. Now here are the test cases and mocks
            
            
            
              generated. Yeah,
            
            
            
              so in the test case I have the request and
            
            
            
              response header and also I have the mocks for the Postgres
            
            
            
              instance. Now let's make another API call
            
            
            
              to get the user that we put on employee id one and there
            
            
            
              was another test case generated. The interesting part is that since Postgres
            
            
            
              is a SQL based database, it captured this whole
            
            
            
              query and you can generate the test cases and mock file mock
            
            
            
              like that. Now let's go ahead and simply run the
            
            
            
              test cases that we captured. So first we need to set the environment
            
            
            
              variable of keploy mode to test.
            
            
            
              Yeah, now let's run the sample
            
            
            
              Java application. Yeah, you can see on the keploy
            
            
            
              server that both the test case is run and passed.
            
            
            
              Yeah. Now let's introduce
            
            
            
              an error. Let's say we have a field named changed which
            
            
            
              is being queried. So instead of first name it will query
            
            
            
              name from the postgres instance. Now let's stop the postgres instance.
            
            
            
              Even without the postgres it is going to run because we
            
            
            
              already have the mocks. So we didn't need postgres.
            
            
            
              So yeah, it has run and one test case is passed and one failed.
            
            
            
              Let's go into detail. So it is why? Because the
            
            
            
              first name is now different. It was not able to query
            
            
            
              the name parameter that we changed and thus the first
            
            
            
              name was null. So this is how you can capture
            
            
            
              the test cases quickly, run those and achieve
            
            
            
              good line coverage with keploy. I hope you have understood
            
            
            
              how keploy works.
            
            
            
              So I hope I made it clear how you can integrate
            
            
            
              keploy in your application and how it
            
            
            
              works, how it can generate test cases and data mocks for
            
            
            
              you automatically. So thank you and that's basically about it.
            
            
            
              And you can also find us on GitHub and
            
            
            
              if you want you can star us. Also, we don't mind and
            
            
            
              feel free to join our slack channel. We would love to have all of you
            
            
            
              in our community. And thanks
            
            
            
              again and thanks for joining today.
            
            
            
              And feel free to reach to me if you have any
            
            
            
              questions. Till then,