<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://justinebateman.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://justinebateman.github.io/" rel="alternate" type="text/html" /><updated>2021-01-07T20:01:26+00:00</updated><id>https://justinebateman.github.io/feed.xml</id><title type="html">QA by Justine</title><subtitle>Thoughts on all things QA</subtitle><author><name>Justine Bateman</name></author><entry><title type="html">The QA Commandments</title><link href="https://justinebateman.github.io/blog/the-qa-commandments/" rel="alternate" type="text/html" title="The QA Commandments" /><published>2021-01-07T16:08:32+00:00</published><updated>2021-01-07T16:08:32+00:00</updated><id>https://justinebateman.github.io/blog/the-qa-commandments</id><content type="html" xml:base="https://justinebateman.github.io/blog/the-qa-commandments/">&lt;h3 id=&quot;dont-test-only-what-the-story-tells-you-to&quot;&gt;Don’t test only what the story tells you to&lt;/h3&gt;

&lt;p&gt;User stories often have acceptance criteria added by a product owner or business analyst. These are usually helpful for QA to know when they can consider a story as “Passed QA”. However, it’s important not to just stick to the AC and test only the “Happy Path” for a feature. The AC usually tells us what we want to happen, but it’s our job as testers to think about what could happen. Remember to use your QA skills to think outside the box and run validation and negative tests to improve your test coverage on a story.&lt;/p&gt;

&lt;h3 id=&quot;dont-forget-about-user-experience&quot;&gt;Don’t forget about user experience&lt;/h3&gt;

&lt;p&gt;Sometimes when we’re working to a deadline and have a lot of QA tasks we get so focused on just the functionality of a feature. If we can’t find any bugs and the tests pass then we move the ticket to the “Passed” column, and move on to next thing on the list. When this happens, we often miss user experience issues because we “can’t see the wood for the trees”. A feature might work as designed, and with no functional defects but it might be really painful and frustrating to use. Usability issues can result in loss of users just as much as a functional defect can. Remember to put yourself in the shoes of the end user when you’re testing, and if a behaviour would frustrate you, recommend changing it.&lt;/p&gt;

&lt;h3 id=&quot;dont-let-developers-bias-you&quot;&gt;Don’t let developers bias you&lt;/h3&gt;

&lt;p&gt;Sometimes, with a complicated user story a developer may meet with the QA team to do a demo of the feature they’ve developed. This can aid understanding in the scope of what needs tested, and any risk areas. However, it can also result in the opposite effect where testers are biased by the developers into assuming something will work. A dev may demo a particular section of a feature and casually mention “I tested this really well and it all works great”. We might then gloss over thoroughly testing this section, and miss an important defect. The developer is already biased because they created the feature, and they’re confident everything works before they hand it over for testing. A testers motto should be “Everything is guilty until proven innocent.” Just because a developer is confident that something will work perfectly in production doesn’t mean we should be until we’ve seen it for ourselves in a variety of scenarios.&lt;/p&gt;

&lt;h3 id=&quot;dont-write-bad-bug-reports&quot;&gt;Don’t write bad bug reports&lt;/h3&gt;

&lt;p&gt;If a bug report is effective then the chances of having the issue fixed are higher, we’ve all had bugs rejected because the developer can’t reproduce it.&lt;/p&gt;

&lt;p&gt;Ensure you have a clear, unambiguous, step by step guide to reproduce the issue. Putting these steps in a bullet point or numbered list makes it more difficult for a step to be missed. A screenshot of the issue is always useful, a screen recording of the steps is often even better. Some good tools for screen recording are: &lt;a href=&quot;https://getsharex.com/&quot;&gt;ShareX on Windows&lt;/a&gt; or &lt;a href=&quot;https://www.cockos.com/licecap/&quot;&gt;LICEcap on macOS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Be specific with your report, don’t write an essay about what’s wrong, keep it to the point. Be careful also not to combine multiple problems even if they seem similar in nature. Compartmentalise your thinking and separate the issues into separate tickets so they can be addressed and retested separately.&lt;/p&gt;

&lt;p&gt;Include as much relevant information as you can to make it quicker and easier for the developer to diagnose the problem. If the issue is only occurring in one browser – state that. If there are errors in the browser console log, copy and paste the full log into the bug report. If your application makes use of a logging tool like Splunk, check the logs for anything relevant and include these in your report.&lt;/p&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="testing" /><category term="process" /><category term="strategy" /><category term="qa" /><summary type="html">Don’t test only what the story tells you to, Don’t forget about user experience, Don’t let developers bias you, Don’t write bad bug reports</summary></entry><entry><title type="html">XPath Selectors</title><link href="https://justinebateman.github.io/blog/xpath-selectors/" rel="alternate" type="text/html" title="XPath Selectors" /><published>2020-04-13T17:08:32+01:00</published><updated>2020-04-13T17:08:32+01:00</updated><id>https://justinebateman.github.io/blog/xpath-selectors</id><content type="html" xml:base="https://justinebateman.github.io/blog/xpath-selectors/">&lt;p&gt;XPath is a query language that we can use to select elements on a webpage. In QA it’s commonly used in automation to select textboxes or buttons on the page that we can interact with.&lt;/p&gt;

&lt;p&gt;Xpath is arguably the slowest way of finding elements on a page so you should use this as a last resort if your element does not have an id or name, and if CSS selectors aren’t an option. XPath is usually useful when you need more complicated logic than what CSS selectors allow for.&lt;/p&gt;

&lt;h3 id=&quot;testing-xpath-in-your-browser&quot;&gt;Testing XPath in your browser&lt;/h3&gt;

&lt;p&gt;In Chrome you can just open DevTools in the Elements tab, hit Ctrl+F or cmd+F and paste your xpath into the search.&lt;/p&gt;

&lt;p&gt;In other browsers you can use the Console tab in DevTools to execute your XPath query eg.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;$x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;//div&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;general-xpath&quot;&gt;General XPath&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nodename&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects all nodes with the name “&lt;em&gt;nodename&lt;/em&gt;“&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects from the root node&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects nodes in the document from the current node that match the selection no matter where they are&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects the current node&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects the parent of the current node&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Selects attributes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;wildcards&quot;&gt;Wildcards&lt;/h3&gt;

&lt;p&gt;XPath wildcards can be used to select unknown XML nodes.&lt;/p&gt;

&lt;p&gt;⚠️ Use these sparingly, wildcards increase the time it takes to find your element(s)&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Wildcard&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Matches any element node&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@*&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Matches any attribute node&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node()&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Matches any node of any kind&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;children-and-descendants&quot;&gt;Children and Descendants&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//ul/li/a&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;a single “/” finds a child element that is directly below the parent&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//ul//li//a&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;two “//” finds any descendants of the parent at any level&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;attributes&quot;&gt;Attributes&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//input[@id=&quot;id&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;id of element&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//input[@class=&quot;class&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;class of an element, matches the class exactly, if your element has multiple classes then see Conditional Logic or contains() below&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//input[@type=&quot;submit&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches an element of type “input” who has an attribute “type” with the value of “submit”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[contains(@href, 'something')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches an element of type a that has an href attribute that contains “something”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[starts-with(@href, 'something')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches an element of type a that has an href attribute that starts with “something”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[ends-with(@href, 'something')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches an element of type a that has an href attribute that ends with “something”&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;attribute-operators&quot;&gt;Attribute Operators&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[@id = &quot;xyz&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;attribute equals a value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[@id != &quot;xyz&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;attribute does not equal a value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[@price &amp;gt; 25]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;attribute value is more than&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[@price = 9.80 or price = 9.70]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;attribute value equals a value OR another value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[@price &amp;gt; 9.00 and price &amp;lt; 9.90]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;attribute value matches one condition AND another condition&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;order-selectors&quot;&gt;Order Selectors&lt;/h3&gt;

&lt;p&gt;If you want to select the first, last or nth element in a list you can use [n] in XPath&lt;/p&gt;

&lt;p&gt;ℹ️ XPath lists start at 1 not 0&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//ul/li[1]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;returns the first “li” child of all “ul” elements&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//ul/li[2]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;returns the second “li” child of all “ul” elements&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//ul/li[last()]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;returns the last “li” child of all “ul” elements&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;conditional-logic&quot;&gt;Conditional Logic&lt;/h3&gt;

&lt;p&gt;You can use OR logic to have multiple selectors for one element, this can be useful for example if your DOM changes when the user is on a mobile device. Instead of having to use different elements for desktop vs. mobile you can use one element and have an OR selector that handles both cases&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[contains(@class, 'enabled') and contains(@class, 'visible')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;AND – if you need to match an element that has this attribute and value,  &lt;strong&gt;and&lt;/strong&gt;  another attribute and value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[contains(@class, 'enabled')][contains(@class, 'visible')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;AND – this is another way of writing the previous expression&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[contains(@class, 'enabled') or contains(@class, 'visible')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;OR – if you need to match an element that has either this attribute value  &lt;strong&gt;or&lt;/strong&gt;  a different attribute value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//a[contains(@class, 'enabled')] | //a[contains(@class, 'visible')]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;OR – this is another way of writing the previous expression&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;other-useful-expressions&quot;&gt;Other Useful Expressions&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Expression&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//button[text()=&quot;Submit&quot;]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches the text of an element exactly&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//button[contains(text(),&quot;Go&quot;)]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;matches an element that contains text “Go”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//product[@price &amp;gt; 2.50]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;you can use maths to match on an attribute that has a value higher or lower than specified&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="xpath" /><category term="automation" /><category term="selectors" /><category term="selenium" /><summary type="html">XPath is a query language that we can use to select elements on a webpage. In QA it's commonly used in automation to select textboxes or buttons on the page that we can interact with.</summary></entry><entry><title type="html">Types of Testing</title><link href="https://justinebateman.github.io/blog/types-of-testing/" rel="alternate" type="text/html" title="Types of Testing" /><published>2020-03-28T16:08:32+00:00</published><updated>2020-03-28T16:08:32+00:00</updated><id>https://justinebateman.github.io/blog/types-of-testing</id><content type="html" xml:base="https://justinebateman.github.io/blog/types-of-testing/">&lt;p&gt;Testing is usually divided into two main categories – functional and non-functional.&lt;/p&gt;

&lt;h3 id=&quot;functional-testing&quot;&gt;Functional Testing&lt;/h3&gt;

&lt;p&gt;Functional testing is a type of testing which verifies that each  &lt;strong&gt;function&lt;/strong&gt;  of the software application matches its requirements.&lt;/p&gt;

&lt;p&gt;Every functionality of the system is tested by providing appropriate input, verifying the output and comparing the actual results with the expected results. The testing can be done either manually or using automation&lt;/p&gt;

&lt;p&gt;Functional Testing types include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Unit Testing&lt;/li&gt;
  &lt;li&gt;Integration Testing&lt;/li&gt;
  &lt;li&gt;System Testing&lt;/li&gt;
  &lt;li&gt;Sanity Testing&lt;/li&gt;
  &lt;li&gt;Smoke Testing&lt;/li&gt;
  &lt;li&gt;Interface Testing&lt;/li&gt;
  &lt;li&gt;Regression Testing&lt;/li&gt;
  &lt;li&gt;Beta/Acceptance Testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;non-functional-testing&quot;&gt;Non-functional Testing&lt;/h3&gt;

&lt;p&gt;Non-functional testing is a type of testing to check non-functional aspects (performance, usability, reliability, etc.) of a software application. It’s basically everything that isn’t covered by functional testing.&lt;/p&gt;

&lt;p&gt;A good example of non-functional test would be to check how many people can simultaneously login into a software.&lt;/p&gt;

&lt;p&gt;Functional tests are usually easy to write expected results for eg.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;1 + 1 should be equal to 2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With non-functional tests it can be more difficult to define expected results. How long should a page take to load? How many concurrent users should you expect to support at any one time?&lt;/p&gt;

&lt;p&gt;Functional testing is based on customer’s  &lt;strong&gt;requirements&lt;/strong&gt;  whereas Non Functional testing is based on customer’s  &lt;strong&gt;expectations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Non-functional testing is equally important as functional testing and affects client satisfaction.&lt;/p&gt;

&lt;p&gt;Non-functional Testing types include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Performance Testing&lt;/li&gt;
  &lt;li&gt;Load Testing&lt;/li&gt;
  &lt;li&gt;Stress Testing&lt;/li&gt;
  &lt;li&gt;Volume Testing&lt;/li&gt;
  &lt;li&gt;Security Testing&lt;/li&gt;
  &lt;li&gt;Compatibility Testing&lt;/li&gt;
  &lt;li&gt;Install Testing&lt;/li&gt;
  &lt;li&gt;Recovery Testing&lt;/li&gt;
  &lt;li&gt;Reliability Testing&lt;/li&gt;
  &lt;li&gt;Usability Testing&lt;/li&gt;
  &lt;li&gt;Compliance Testing&lt;/li&gt;
  &lt;li&gt;Localization Testing&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="testing" /><category term="fundamentals" /><category term="qa" /><summary type="html">Testing is usually divided into two main categories – functional and non-functional.</summary></entry><entry><title type="html">What is QA?</title><link href="https://justinebateman.github.io/blog/what-is-qa/" rel="alternate" type="text/html" title="What is QA?" /><published>2020-03-20T16:08:32+00:00</published><updated>2020-03-20T16:08:32+00:00</updated><id>https://justinebateman.github.io/blog/what-is-qa</id><content type="html" xml:base="https://justinebateman.github.io/blog/what-is-qa/">&lt;p&gt;Quality assurance (QA) is a way of preventing mistakes and defects in products and avoiding problems when delivering products or services to customers. This defect prevention in quality assurance is often referred to as “shift left” since it focuses on quality earlier in the process.&lt;/p&gt;

&lt;p&gt;Quality assurance is made up of activities implemented in a quality system so that requirements and goals for a product, service or activity will be fulfilled. It is the systematic measurement, comparison with a standard, monitoring of processes and an associated feedback loop that confers error prevention.&lt;/p&gt;

&lt;p&gt;Quality assurance includes two principles: “Fit for purpose” (the product should be suitable for the intended purpose); and “right first time” (mistakes should be eliminated). QA includes management of the quality of raw materials, assemblies, products and components, services related to production, and management, production and inspection processes. The two principles also manifest before the background of developing (engineering) a novel technical product: The task of engineering is to make it work once, while the task of quality assurance is to make it work all the time.&lt;/p&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="testing" /><category term="fundamentals" /><category term="qa" /><summary type="html">Quality assurance (QA) is a way of preventing mistakes and defects in products and avoiding problems when delivering products or services to customers. This defect prevention in quality assurance is often referred to as “shift left” since it focuses on quality earlier in the process.</summary></entry><entry><title type="html">Don’t Forget your QA Soft Skills</title><link href="https://justinebateman.github.io/blog/dont-forget-your-qa-soft-skills/" rel="alternate" type="text/html" title="Don’t Forget your QA Soft Skills" /><published>2019-05-09T17:08:32+01:00</published><updated>2019-05-09T17:08:32+01:00</updated><id>https://justinebateman.github.io/blog/dont-forget-your-qa-soft-skills</id><content type="html" xml:base="https://justinebateman.github.io/blog/dont-forget-your-qa-soft-skills/">&lt;p&gt;Communication and teamwork are skills that are vital to effectively meet project goals. When it comes to QA, don’t spend so much time working on your technical skills that you neglect your soft skills.&lt;/p&gt;

&lt;h3 id=&quot;remember-to-be-tactful&quot;&gt;Remember to be Tactful&lt;/h3&gt;

&lt;p&gt;As testers, we are often the bearers of bad news. A lot of the time we have to tell the developers that their baby is ugly. When we’re reporting bugs we have to be mindful that a dev may have spent weeks or months working on the feature we’re testing. They’re normally very proud of what they’ve created, and can get understandably defensive about any sort of criticism. It is possible to deliver bad news tactfully, and diplomatically in order to cushion the blow. Objective language can be used when reporting the bug to make the issue more palatable - “This is what I see happening” as opposed to “This is what you’ve done wrong, and this is what I think you should do differently.” People are usually more receptive to this type of language because it feels like less of a personal attack.&lt;/p&gt;

&lt;h3 id=&quot;dont-play-the-blame-game&quot;&gt;Don’t play the Blame Game&lt;/h3&gt;

&lt;p&gt;It can be stressful when you’re coming up to an important deadline and you come across a high impact bug during your testing. Sometimes it can seem as though a developer has performed absolutely no testing of their own before turning a feature over to QA. It’s important to remember that developers are often under pressure to get features finished as quickly as possible and they don’t always have time to test things as thoroughly as they would like. Blaming the developer for causing the bug is a waste of time and doesn’t help the team to meet project goals.&lt;/p&gt;

&lt;p&gt;Similarly when a bug makes it to production – nothing is gained by spending time trying to figure out if it was the fault of the BA with missed requirements, the designer with bad mockups, the developer with buggy code, or another tester who missed it. When a failure happens in production the entire team is responsible for resolving the problem quickly and efficiently, and figuring out how their processes can be improved to reduce the likelihood of a similar failure happening again.&lt;/p&gt;

&lt;h3 id=&quot;celebrate-the-wins&quot;&gt;Celebrate the Wins&lt;/h3&gt;

&lt;p&gt;A big part of our jobs as QA Engineers is to constantly find the flaws in everything. It’s our responsibility to go through things with a fine-tooth comb and report any defect or inconsistency. It’s important to also remember to celebrate the things that are done right. Don’t forget to thank or celebrate a member of your team for a particularly well written requirements document, a really helpful design document, a great quality feature in the application. This attitude can be especially helpful in a retrospective meeting - remember to include items in the “what went right this sprint?” column instead of filling up the “what went wrong this sprint?” column.&lt;/p&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="testing" /><category term="process" /><category term="strategy" /><category term="qa" /><summary type="html">Communication and teamwork are skills that are vital to effectively meet project goals. When it comes to QA, don't spend so much time working on your technical skills that you neglect your soft skills.</summary></entry><entry><title type="html">How Not to do QA</title><link href="https://justinebateman.github.io/blog/how-not-to-do-qa/" rel="alternate" type="text/html" title="How Not to do QA" /><published>2019-04-02T17:08:32+01:00</published><updated>2019-04-02T17:08:32+01:00</updated><id>https://justinebateman.github.io/blog/how-not-to-do-qa</id><content type="html" xml:base="https://justinebateman.github.io/blog/how-not-to-do-qa/">&lt;h3 id=&quot;qa-is-not-involved-in-each-stage&quot;&gt;QA is not involved in each stage&lt;/h3&gt;

&lt;p&gt;QA is often referred to as simply “Testing”. In reality, &lt;a href=&quot;https://intersog.com/blog/tech-tips/qa-vs-testing/&quot;&gt;testing is only one of the things&lt;/a&gt; that a good QA engineer brings to a team. QA stands for Quality Assurance - a QA engineer aims to ensure the quality of the development process and its results.&lt;/p&gt;

&lt;p&gt;A good SDLC process has QA involved at each stage, right from planning through to support and maintenance. Testers often bridge the gaps between technical developers, product owners or stakeholders, and the end user. Testers are uniquely placed to have the most overall knowledge of how a product works from a user perspective, and also understand the technical details of what’s going on behind the scenes to make it work that way.&lt;/p&gt;

&lt;p&gt;QA engineers then have a clear overview of the entire SDLC process and can point out inefficiencies and gaps. It’s their job to not only improve the quality of the end product, but also the process that’s used to develop it.&lt;/p&gt;

&lt;h3 id=&quot;focusing-on-cost-rather-than-value&quot;&gt;Focusing on Cost rather than Value&lt;/h3&gt;

&lt;p&gt;The earlier an issue is found the less money it costs. Consider a high priority issue reported to the customer support team that affects a large amount of users. The time taken to triage, investigate, debug, resolve, test, redeploy, and communicate the fix to stakeholders vs. if the problem had been discovered in a QA environment. The turnaround time for a fix would be a lot smaller and involve less people than dealing with a Production issue.&lt;/p&gt;

&lt;p&gt;The severity of the issue also needs to be taken into account, companies have gone out of business due to manufacturing a poor quality product. This could be because they faced lawsuits, or simply because their reputation was irreversibly damaged with their target consumer.&lt;/p&gt;

&lt;p&gt;An extreme example of this is the &lt;a href=&quot;https://hackaday.com/2015/10/26/killed-by-a-machine-the-therac-25/&quot;&gt;Therac-25&lt;/a&gt;, a radiation therapy machine that caused accidental radiation overdoses killing at least six patients. This was caused by poor software developed with no QA process.&lt;/p&gt;

&lt;h3 id=&quot;sacrificing-quality-for-speed&quot;&gt;Sacrificing Quality for Speed&lt;/h3&gt;

&lt;p&gt;There is a common misconception that QA slows down development. Many project managers/scrum masters see QA as a blocker to getting tasks into the Done column. However, if you factor the QA team into the process at an earlier stage it can actually save time in the long run.&lt;/p&gt;

&lt;p&gt;One of the most important stages in the SDLC is Requirements Gathering. Mistakes made during this stage echo throughout the entire lifecycle and end up having an impact on the product that makes it into the live environment. QA engineers often know your application better than anyone else on the team, so having them involved in requirements gathering and scope setting enables them to point out which solutions will and won’t work, and to remind the team of areas in the application they might not have considered.&lt;/p&gt;

&lt;p&gt;Introducing non functional QA like performance and load testing to your process can have a tangible impact on your server and hosting costs. Less hardware is required to run your application if performance is optimised, and less storage space is needed if we avoid saving data we don’t actually use.&lt;/p&gt;

&lt;p&gt;We can also improve staffing costs by investing in QA. If we prioritise QA resources and catch issues early we don’t need to invest as many resources into a Support team because they won’t have as much to do!&lt;/p&gt;</content><author><name>Justine Bateman</name></author><category term="Blog" /><category term="testing" /><category term="process" /><category term="strategy" /><category term="qa" /><summary type="html">QA is not involved in each stage, Focusing on Cost rather than Value, Sacrificing Quality for Speed</summary></entry></feed>