<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manuel Mariñez</title>
    <description>The latest articles on DEV Community by Manuel Mariñez (@mmarinez20).</description>
    <link>https://dev.to/mmarinez20</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F28032%2Fde56dd69-4b9b-4fbc-acbd-a083943e4ab1.png</url>
      <title>DEV Community: Manuel Mariñez</title>
      <link>https://dev.to/mmarinez20</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mmarinez20"/>
    <language>en</language>
    <item>
      <title>API testing tools: An Example Based Guide</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Sun, 02 Aug 2020 03:55:00 +0000</pubDate>
      <link>https://dev.to/mmarinez20/api-testing-tools-an-example-based-guide-4m9f</link>
      <guid>https://dev.to/mmarinez20/api-testing-tools-an-example-based-guide-4m9f</guid>
      <description>&lt;p&gt;For API testing there are a lot of tools out there that let you perform the test and collect the results. In this article, I’ll be focusing on three tools by straight-up showing how to do a request using the Trello API.&lt;/p&gt;

&lt;p&gt;But before we start, since we are going to use the Trello API we will need an account, an authorization key, and token. For API testing and development, this is a pretty common step that is used for security measures since through APIs we can have access to databases and internal functionalities of the code that could be exploited by malicious users. For that, I’ll leave this &lt;a href="https://developer.atlassian.com/cloud/trello/guides/rest-api/api-introduction/" rel="noopener noreferrer"&gt;link&lt;/a&gt; with all the steps you need to get started, you can find these steps in the API introduction right below the “Authorization and authentication” section (you will see this as soon as you click on the link).&lt;/p&gt;

&lt;p&gt;Once you are all set, let’s get started with the API testing tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;OS Terminal&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For the example, to get a response from our API using the terminal we will need the command line called “curl” which is commonly used in a lot of softwares to, you guessed it, transfer data from one another&lt;/p&gt;

&lt;p&gt;We are going to add the following command in the OS terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --location --request GET 'https://api.trello.com/1/members/me/boards?key={your-key}&amp;amp;token={your-token} -I' 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here we get all headers &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739309228484984882%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739309228484984882%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And at the top is the status code for our response.&lt;/p&gt;

&lt;p&gt;A cool feature is that we can save the response in a file in case we need it later on for a scan or to validate some of its fields. This can be done typing the command once again with a simple flag “-o [name of the file]”. For example “-o test_response.txt”&lt;/p&gt;

&lt;p&gt;Once you do that you should see in your terminal a meter indicating the download progress&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739315562886201364%2Funknown.png%3Fwidth%3D1384%26height%3D50" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739315562886201364%2Funknown.png%3Fwidth%3D1384%26height%3D50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you prefer not to add a name to the file just add the flag “-O” to save the file with the URL as the file name.&lt;/p&gt;

&lt;p&gt;And finally for when we need to create, update or delete from the cURL we add the following commands according to what we need “-X POST” “-X PUT” “-X DELETE” alongside the “    --data-raw ‘{“param”:”value”}’    ”&lt;/p&gt;

&lt;p&gt;Now let’s see how the next tool can handle these same scenarios and what features does it bring to the table:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;POSTMAN&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With postman, we get all the information we need with just one click. Let see the examples below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739316460752601088%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739316460752601088%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as we send our request we get more information than we can ask for. For starters we get the full response with a pretty format so is a lot more readable and we don’t have to format it on our own, then we have the status code so we know if the request was successful or not, in this case, all went as expected and we got a 200 status code and also a dedicated tab to add params and its values which are directly added to our request URL.&lt;/p&gt;

&lt;p&gt;We get all the information we got from the OS terminal in just one click, which saves us time and effort in order to be more efficient at testing our API.&lt;/p&gt;

&lt;p&gt;With that example, there are other key features that postman gets to our disposal like saving our request into a collection (Set of request URLs saved into a folder) in which we retrieve the URL at any moment without typing it into the input all over again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739317196714541166%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739317196714541166%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can also export the request for further use into a test report or run it into a CI tool like circleCI or Jenkins.&lt;/p&gt;

&lt;p&gt;Postman gives us the chance to work with multiple requests in different tabs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739317445394825246%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739317445394825246%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case we need to get the request in a particular language it gives us the code snippet to do so by clicking code in the params type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318039262134352%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318039262134352%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can manage different environments in which we can store different variables, the variables can be named however the user wants and assign the values, like the common parts of the request URL so the user just has to handle the request&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318363980824616%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318363980824616%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318992778428456%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739318992778428456%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A history of all the requests we have done recently so the user can go back and do the same request with specific params or just execute it once more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319213776306196%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319213776306196%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postman has a dedicated section to add scripted tests in Javascript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319376565501952%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319376565501952%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes predefined code snippets we can use.&lt;/p&gt;

&lt;p&gt;A console where we can see our response HTTP and print messages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319810302935070%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739319810302935070%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are what I consider the key features that postman let us work with to have a smoother experience while testing with API in general.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SoapUI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s keep going with the same example&lt;/p&gt;

&lt;p&gt;Our first impression of SoapUI as soon as we enter is that it will prompt us with the endpoint explorer which lets us make the request to our Trello API like previous tools but in this case like the terminal, we get a raw text response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320304442146916%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320304442146916%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, it can be noticed that we can add headers to our request in case we need authorization for example, and that at the top of our raw text we have the response status.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320436621574144%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320436621574144%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the bottom, we can see the unformatted JSON with the data that we need. Unfortunately from the Endpoint prompt, we can’t make it look pretty so what we need to do is inside a project. The first step to do so is to click on the save request (blue) button right next to the send (green) button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320593782145024%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320593782145024%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set Up a name for your request to save it and click the OK button, this action will create the project that will be displayed to the left side of the program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320782806843424%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320782806843424%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Double click on “Project 1” (you can right-click on it if you want to change its name) and you will have an overview of all the components of your project, but for now, I’ll focus on the request. Expand the project folder until you request the request which is in the last layer and click “TrelloAPI”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320920753045504%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739320920753045504%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as you click on the send request button you will notice a message that says “The content you are trying to view cannot be viewed as XML” that is because is the default of multiple views we have for our response, to the left side you will notice four tabs XML, JSON, HTML and Raw.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321045525200927%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321045525200927%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on JSON and we will get the pretty formatted response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321247116165130%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321247116165130%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check the other tabs whenever applicable. &lt;/p&gt;

&lt;p&gt;SoapUI gives us a big variety of features to let us apply API testing more efficiently. The first one I would like to highlight is setting our tests into test suites each one with their test cases and test steps making it easy for the tester to group the tests in logical units.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321330951913472%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321330951913472%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Support for WSDL and SOAP services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321457074634793%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321457074634793%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Load and security testing dedicated inputs for testing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321575870038047%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321575870038047%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321894544605224%2Funknown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F739308022140239935%2F739321894544605224%2Funknown.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Disadvantages&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For this section, I’ll be adding things to consider for each of the tools so you can choose depending on your work environment and necessities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS Terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lack of user interface and hand-holding. This is the most obvious since the user would need previous knowledge of the commands that are needed to send the requests and get the response in a readable format. The terminal can be customized to ease this problem but it would be an extra layer of configuration outside the main purpose of testing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Missing test monitoring. This missing functionality can be a let down to many developers or testers in case they wanted to rely on a single tool to work on all testing suites.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SoapUI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning curve. SoapUI is a powerful tool but it comes with some challenges and a not so user-friendly interface. It will take some time for the user to understand the project structure based on the different components like test suites, test cases, assertions, and load tests to get full advantage of the tool.&lt;/p&gt;

&lt;p&gt;For Postman and SoapUI, there are some features that are behind a paywall but I don’t consider that it is necessarily a disadvantage since those features are mostly to work with a team of 5 or more people requiring to share a project. But for an individual user, the features available for free are more than enough to get the job done.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Up until this point we have seen some of the features on each tool following one scenario, in this article I’ve talked about features that are not related to the automated testing since I think that should be a topic of its own. Each tool has pros and cons comparing them to each other, but all of them can help the tester depending on the requirements of the test assigned, it would be up to the tester to decide what strategy to follow with one of these tools. &lt;/p&gt;

</description>
      <category>testing</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What are APIs? and How can they enhance your testing?</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Wed, 24 Jun 2020 04:28:01 +0000</pubDate>
      <link>https://dev.to/mmarinez20/what-are-apis-and-how-can-they-enhance-your-testing-5bmo</link>
      <guid>https://dev.to/mmarinez20/what-are-apis-and-how-can-they-enhance-your-testing-5bmo</guid>
      <description>&lt;p&gt;An API (Application programming interface) is a set of tools that are used to build software and also make them communicate with each other. The way this is done is by using REST for formatting the information payload requested by the client with a standard text format like JSON, XML or raw text, then the data is sent to the server with HTTP methods like GET, POST, PUT and DELETE to name a few, the server then interprets the data, performs the action requested and sends the data back to the client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F198817780210860032%2F725188913341399040%2Fdata-api.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F198817780210860032%2F725188913341399040%2Fdata-api.png" alt="API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As technical as that definition can be it took me some time to get it all together, there are way too many good and extended definitions of what an API is, but it all can be summed up to an analogy that you have probably seen in a youtube video or another blog. &lt;/p&gt;

&lt;p&gt;“You (the client) are in a restaurant and you wish to order food to the kitchen(the system) here is when the waiter(API) comes in to take and deliver your order to the kitchen, then the kitchen  prepares your order and the waiter comes back with the food order requested.”&lt;/p&gt;

&lt;p&gt;A real-world example of this is whenever we want to sign in to a web application like Gmail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F198817780210860032%2F725199996504375347%2Funknown.png%3Fwidth%3D440%26height%3D475" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F198817780210860032%2F725199996504375347%2Funknown.png%3Fwidth%3D440%26height%3D475" alt="gmail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We fill the required fields like email address and password, then the API takes that information to the system, then the system validates if the email and password are stored in the database and depending on the outcome of the validation the API returns with the webpage bypass access to the user, a message saying that the action could not be completed because the user is not registered, the username is not valid or that the password is incorrect. APIs are under the hood operations that are not visible to the user while it is in the GUI (Graphical User Interface).&lt;/p&gt;

&lt;p&gt;Getting familiar with APIs and how they work gives a wide number of advantages from building and optimizing your software to knowing how to test key features that are the main interest of the business. This part is important because APIs are seen as part of the business layer of the software architecture.&lt;/p&gt;

&lt;p&gt;As software testers, we can expand our test scope in a significantly more efficient way since there is no GUI interaction, the test scenarios can be executed and the results can be collected a lot faster. For example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Scenario: Validate input search&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatatables.net%2Fforums%2Fuploads%2Feditor%2Fr2%2Fz7waa3vf5efl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatatables.net%2Fforums%2Fuploads%2Feditor%2Fr2%2Fz7waa3vf5efl.png" alt="inputsearch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the input search with an empty field.&lt;/li&gt;
&lt;li&gt;Check the input search with special characters.&lt;/li&gt;
&lt;li&gt;Check the character limit in the input search.&lt;/li&gt;
&lt;li&gt;Check the input search with SQL expression.&lt;/li&gt;
&lt;li&gt;Check the input search with HTML tags.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see this scenario is not different from what we could do in a GUI but with the twist that we don’t have to open a web browser to access the URL, look for the specific input search that needs to be tested and then applying the test cases. All this can be done by simply sending a GET request with the correct URL and the desired parameters or variables.&lt;/p&gt;

&lt;p&gt;To perform the tests there are several tools that can be used from an OS terminal to dedicated software like Postman or SoapUI. I’ll cover these tools in part 2 where I’ll go through its features, advantages, and disadvantages.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>career</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Console Messages in Test Automation Reports: Implementation and Advantages</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Sun, 26 Apr 2020 14:55:50 +0000</pubDate>
      <link>https://dev.to/mmarinez20/console-messages-in-test-automation-reports-implementation-and-advantages-2a2o</link>
      <guid>https://dev.to/mmarinez20/console-messages-in-test-automation-reports-implementation-and-advantages-2a2o</guid>
      <description>&lt;p&gt;The web console, also known as f12, hacking screen and many other names that made you believe that you were a web developer by changing HTML tags to place your name in a big bold title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F674mdki6hcuilopkkjxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F674mdki6hcuilopkkjxb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that said, for this tutorial I want to highlight the selenium feature to capture those web console messages that can get us a good idea of what could be causing an error in our AUT(Application Under Test), in case that we are pretty sure that the selector of our web element is not broken, changed or not visible by our web driver.&lt;/p&gt;

&lt;p&gt;Things we will need to make this work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenium-python.readthedocs.io/installation.html" rel="noopener noreferrer"&gt;Selenium web driver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.pytest.org/en/latest/getting-started.html" rel="noopener noreferrer"&gt;Pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.qameta.io/allure/#_pytest" rel="noopener noreferrer"&gt;Allure report&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First we will setup a couple of test to work on. I'll be using &lt;a href="https://www.eviltester.com/page/tools/thepulper/" rel="noopener noreferrer"&gt;the pulper&lt;/a&gt; a web page design for testing practice. You can click on the link to set it up in case you want to use it, but any website can do the job for this tutorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pageobject.pagefactory&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestHomePage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;go_to_homepage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pulp_homepage_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pulp App Main Menu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pulp_homepage_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_table_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_table_link&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Table of Books&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tablepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table_page_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_list_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_link_list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of Books&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listpage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list_page_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_FAQs_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_link_faq&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FAQs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;faqpage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;faq_page_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we have this test going, lets add the allure package by importing it and adding allure title and step decorators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;allure&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pageobject.pagefactory&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestHomePage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;go_to_homepage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nd"&gt;@allure.title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test homepage title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pulp_homepage_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pulp App Main Menu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pulp_homepage_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Page Object class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@allure.step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Click table link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;click_table_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link_table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nd"&gt;@allure.step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Click link list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;click_link_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nd"&gt;@web_driver&lt;/span&gt;
    &lt;span class="nd"&gt;@allure.step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Click link faq&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;click_link_faq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link_faq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now with everything set, our allure report should look something like this once we run the tests in our CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--alluredir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;test-report/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F560kkq6xahf9f9929z75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F560kkq6xahf9f9929z75.png" alt="Allure Report Test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I'm going to focus on our FAQs test. Notice that we have a function defined to click on the FAQs link, I've done this in order to capture the step on the allure report and to add the console logs to see what happens backstage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@allure.title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test FAQs link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_FAQs_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_link_faq&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FAQs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;faqpage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;faq_page_title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Page Object class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@web_driver&lt;/span&gt;
    &lt;span class="nd"&gt;@allure.step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Click link faq&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;click_link_faq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link_faq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In python we get the console logs through the &lt;strong&gt;get_log()&lt;/strong&gt; function giving &lt;em&gt;browser&lt;/em&gt; as an argument to get the browser JS logs that are displayed in the web console. There are more arguments that can be passed to our &lt;strong&gt;get_log()&lt;/strong&gt; function but for this tutorial we will be focusing on this one.&lt;/p&gt;

&lt;p&gt;After we run this test again in our allure report, we should get a section called "stdout" under the steps of this particular test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvc88ohg1jtii88whurrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvc88ohg1jtii88whurrr.png" alt="Console Message"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And with this we finish the implementation of the console messages into our allure report.&lt;/p&gt;

&lt;p&gt;With the previous implementation of web console message into our test report we get a couple of advantages to catch potential issues into our application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Robust more complete test report: We can give to our developer a better perspective of the test results, a way to give a much better idea of the bug and it's solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proactive testing: We get ahead of potential issues by getting Network messages, security warnings, JavaScript warnings and API messages. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this we conclude our tutorial, I hope it is helpful to you and your team.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is your ideal coding hour?</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Fri, 10 Aug 2018 12:01:00 +0000</pubDate>
      <link>https://dev.to/mmarinez20/what-is-your-ideal-coding-hour-1pn5</link>
      <guid>https://dev.to/mmarinez20/what-is-your-ideal-coding-hour-1pn5</guid>
      <description>&lt;p&gt;As a Software Quality Assurance by day and Software Engineering student at night, I have my difficulties trying to improve my coding skills during the day. Having a job, studying, (beautiful) girlfriend, family and friends, I sometimes struggle when I want to take a moment for me to code. While reading one of the posts here at Dev.to I found someone that recommended to wake up 1 hour earlier in the morning to do what i wanted, and that really helped... until I had so much homework to do that... well, I wanted to sleep at least 5 hours. &lt;/p&gt;

&lt;p&gt;For motivation purposes I've been thinking on building a birthday webpage for my girlfriend's birthday during the #100DaysOfCode challenge that I recently get to know about&lt;/p&gt;

&lt;p&gt;So I came up with this question for you all!, What is the best moment for you to code (you can add any ritual you do for preparation &amp;lt;('-'&amp;lt;) (&amp;gt;'-')&amp;gt; ).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSjw_tqwcUoum1XKRCsguoOGZHkyQV8buIXgpwbUTMrbofkCnQ-" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSjw_tqwcUoum1XKRCsguoOGZHkyQV8buIXgpwbUTMrbofkCnQ-"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Would it be possible to have Dev.To community meetup?</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Thu, 09 Aug 2018 17:41:46 +0000</pubDate>
      <link>https://dev.to/mmarinez20/would-it-be-possible-to-have-devto-community-meetup-4ec6</link>
      <guid>https://dev.to/mmarinez20/would-it-be-possible-to-have-devto-community-meetup-4ec6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSjS0QRJz53FK9hBoxYFq5X4eiRlUJMjFAnn8OndvVo_qjX1J61" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSjS0QRJz53FK9hBoxYFq5X4eiRlUJMjFAnn8OndvVo_qjX1J61"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>What are your Interview tips and tricks? Besides having knowledge</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Tue, 31 Jul 2018 15:56:10 +0000</pubDate>
      <link>https://dev.to/mmarinez20/what-are-your-interview-tips-and-tricks-besides-having-knowledge-4l4</link>
      <guid>https://dev.to/mmarinez20/what-are-your-interview-tips-and-tricks-besides-having-knowledge-4l4</guid>
      <description>&lt;p&gt;I'm curious on how you all manage is an interview. Tell me what's up ... for academical purposes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G6YVbhPn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.embed.ly/1/image%3Furl%3Dhttps%253A%252F%252Fthumbs.gfycat.com%252FCarefreeVariableChrysalis-size_restricted.gif%26key%3D522baf40bd3911e08d854040d3dc5c07" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G6YVbhPn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.embed.ly/1/image%3Furl%3Dhttps%253A%252F%252Fthumbs.gfycat.com%252FCarefreeVariableChrysalis-size_restricted.gif%26key%3D522baf40bd3911e08d854040d3dc5c07" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>What is your experience with interviews under pressure?</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Fri, 27 Jul 2018 13:34:14 +0000</pubDate>
      <link>https://dev.to/mmarinez20/what-is-your-experience-with-interviews-under-pressure-53mn</link>
      <guid>https://dev.to/mmarinez20/what-is-your-experience-with-interviews-under-pressure-53mn</guid>
      <description>&lt;p&gt;And by under pressure I mean, getting to know you are having an interview the same day you send your Resume.&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Which Android development book can you recommend?</title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Sun, 21 Jan 2018 23:04:20 +0000</pubDate>
      <link>https://dev.to/mmarinez20/which-android-development-book-can-you-recommend-3b8f</link>
      <guid>https://dev.to/mmarinez20/which-android-development-book-can-you-recommend-3b8f</guid>
      <description></description>
      <category>discuss</category>
    </item>
    <item>
      <title>How does dev.to post ranking works? </title>
      <dc:creator>Manuel Mariñez</dc:creator>
      <pubDate>Thu, 11 Jan 2018 17:00:02 +0000</pubDate>
      <link>https://dev.to/mmarinez20/how-does-the-devto-ranking-post-works-9gp</link>
      <guid>https://dev.to/mmarinez20/how-does-the-devto-ranking-post-works-9gp</guid>
      <description></description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
