<?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: Artem Tregub</title>
    <description>The latest articles on DEV Community by Artem Tregub (@pie_tester).</description>
    <link>https://dev.to/pie_tester</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%2F1112524%2Fa18fff77-b36e-4537-854f-6b119fbf0718.jpeg</url>
      <title>DEV Community: Artem Tregub</title>
      <link>https://dev.to/pie_tester</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pie_tester"/>
    <language>en</language>
    <item>
      <title>Building a Basic HTTP Server with Python: A Guide for Automation and Prototyping</title>
      <dc:creator>Artem Tregub</dc:creator>
      <pubDate>Mon, 07 Aug 2023 19:40:01 +0000</pubDate>
      <link>https://dev.to/pie_tester/building-a-basic-http-server-with-python-a-guide-for-automation-and-prototyping-4967</link>
      <guid>https://dev.to/pie_tester/building-a-basic-http-server-with-python-a-guide-for-automation-and-prototyping-4967</guid>
      <description>&lt;h2&gt;
  
  
  What is this article about
&lt;/h2&gt;

&lt;p&gt;This article presents a basic example of a Python-based HTTP server. It can be useful for personal needs, whether it be automation or prototyping. Moreover, it can be of use to software test (automation) engineers who wish to mock external services for System Testing or to remove environment instability or dependency.&lt;/p&gt;

&lt;p&gt;Thanks to Python and its libraries, starting or editing this server (which is less than 200 lines of code) is straightforward. All the code is available in this &lt;a href="https://github.com/Bartk0/base_http_server"&gt;repo&lt;/a&gt;. Feel free to experiment and use it for your goals. However, I strongly recommend not using it with sensitive information due to the absence of cyber security checks and coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The implementation
&lt;/h2&gt;

&lt;p&gt;The Base HTTP server is a standard library in Python, provided since version 2.7. It offers classes for the server itself and the request handler.&lt;/p&gt;

&lt;p&gt;To get started, we'll need to import the necessary libraries and start our server. It's important to maintain the &lt;em&gt;do_GET&lt;/em&gt; and &lt;em&gt;do_POST&lt;/em&gt; functions as they are. From the outset, we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;em&gt;Server&lt;/em&gt; class, which aids in listening to a specific address and port,&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;RequestHandler&lt;/em&gt; class, tasked with managing server requests via the &lt;em&gt;do_GET&lt;/em&gt; and &lt;em&gt;do_POST&lt;/em&gt; methods, which will be automatically invoked based on the HTTP method,&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;start_server&lt;/em&gt; function that acts as a wrapper to initiate our server,&lt;/li&gt;
&lt;li&gt;and finally, the &lt;em&gt;main&lt;/em&gt; block that includes a standard ArgumentParser, offering basic help and facilitating the required server address and port input.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer
from json import dumps


class Server(HTTPServer):
    def __init__(self, address, request_handler):
        super().__init__(address, request_handler)


class RequestHandler(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server_class):
        self.server_class = server_class
        super().__init__(request, client_address, server_class)

    def do_GET(self):
        response = {"message": "Hello world"}
        self.send_response(200)
        self.send_header("Content-type", "application/json")
        self.send_header("Content-Length", str(len(dumps(response))))
        self.end_headers()
        self.wfile.write(str(response).encode('utf8'))

    def do_POST(self):
        response = {"message": "Hello world"}
        self.send_response(200)
        self.send_header("Content-type", "application/json")
        self.send_header("Content-Length", str(len(dumps(response))))
        self.end_headers()
        self.wfile.write(str(response).encode('utf8'))


def start_server(addr, port, server_class=Server, handler_class=RequestHandler):
    server_address = (addr, port)
    http_server = server_class(server_address, handler_class)
    print(f"Starting server on {addr}:{port}")
    http_server.serve_forever()


def main():
    parser = argparse.ArgumentParser(description="Run a simple HTTP server.")
    parser.add_argument(
        "-l",
        "--listen",
        default="0.0.0.0",
        help="Specify the IP address which server should listen",
    )
    parser.add_argument(
        "-p",
        "--port",
        type=int,
        default=80,
        help="Specify the port which server should listen",
    )
    args = parser.parse_args()
    start_server(addr=args.listen, port=args.port)


if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, we already have a functional HTTP server that will respond to any GET and POST HTTP requests with the json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"message": "Hello world"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good, but let's make it more useful. To enhance this server, we're going to establish it as a classic "mock server". This requires incorporating various HTTP path handling (including links and methods), data storage, and fundamental server responses.&lt;/p&gt;

&lt;p&gt;Next, I suggest we work with json and xml to give a demonstration. It's also generally useful to have a heartbeat method in place. It is a type of function that routinely checks system or network connections to ensure they're operating correctly.&lt;/p&gt;

&lt;p&gt;First up, let's add a straightforward class to encapsulate the paths our server will use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Path:
    JSON = "/json"
    XML = "/xml"
    HEALTH = "/health"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basic init data responses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Response:
    HEALTH_GOOD_RESPONSE = dumps({"message": "I'm doing great!"})
    DEFAULT_RESPONSE = dumps({"message": "Hello there. This is a default server response."})
    GOOD_RESPONSE = dumps({"message": "I got your data"})
    INIT_JSON_DATA = dumps({"status": True, "data": {"id": "FEFE", "some_field": "some_field_data"}})
    INIT_XML_DATA = '&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;' \
                    '&amp;lt;status&amp;gt;True&amp;lt;/status&amp;gt;' \
                    '&amp;lt;data&amp;gt;' \
                    '&amp;lt;id&amp;gt;FEFE&amp;lt;/id&amp;gt;' \
                    '&amp;lt;some_field&amp;gt;some_field_data&amp;lt;/some_field&amp;gt;' \
                    '&amp;lt;/data&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And storage that will work only during runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Storage:
    def __init__(self):
        self.json = Response.INIT_JSON_DATA
        self.xml = Response.INIT_XML_DATA

    def write_json(self, data):
        self.json = data

    def read_json(self):
        return self.json

    def write_xml(self, data):
        self.xml = data

    def read_xml(self):
        return self.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then introduce new classes during the &lt;em&gt;Server&lt;/em&gt; and &lt;em&gt;RequestHandler&lt;/em&gt; initialization to highlight dependency and support future modifications. Additionally, the &lt;em&gt;RequestHandler&lt;/em&gt; will have access to this new data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Server(HTTPServer):
    def __init__(self, address, request_handler, storage, paths, response):
        super().__init__(address, request_handler)
        self.storage = storage
        self.path = paths
        self.response = response


class RequestHandler(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server_class):
        self.server_class = server_class
        self.response_json_data = server_class.storage.read_json()
        self.response_xml_data = server_class.storage.read_xml()
        super().__init__(request, client_address, server_class)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to adjust our &lt;em&gt;RequestHandler.doGET&lt;/em&gt; and &lt;em&gt;RequestHandler.doPOST&lt;/em&gt; methods. The logic behind this is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;check the method type (&lt;em&gt;BaseHTTPRequestHandler&lt;/em&gt; will handle this for us),&lt;/li&gt;
&lt;li&gt;verify the path that was used in the request,&lt;/li&gt;
&lt;li&gt;invoke the requested method or function.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def do_GET(self):
    if self.path == self.server_class.path.JSON:
        return self.json_response()

    if self.path == self.server_class.path.XML:
        return self.xml_response()

    if self.path == self.server_class.path.HEALTH:
        return self.return_health()

    return self.default_response()


def do_POST(self):
    if self.path == self.server_class.path.JSON:
        return self.store_json_test_data()

    if self.path == self.server_class.path.XML:
        return self.store_xml_test_data()

    return self.default_response()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In order to respond with a minimal HTTP data we need to provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data type (specified in the header)&lt;/li&gt;
&lt;li&gt;Data length (also in the header)&lt;/li&gt;
&lt;li&gt;Response code&lt;/li&gt;
&lt;li&gt;Response data
You can find more information about HTTP headers &lt;a href="https://en.wikipedia.org/wiki/HTTP"&gt;here&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def set_json_headers(self, success_response=None):
    self.send_response(200)
    if success_response is not None:
        self.send_header("Content-type", "application/json")
    self.send_header("Content-Length", str(len(success_response)))
    self.end_headers()


def set_response(self, response):
    self.wfile.write(str(response).encode('utf8'))


def return_health(self):
    """
    Implementation for health method and response.
    """
    self.set_json_headers(self.server_class.response.HEALTH_GOOD_RESPONSE)
    self.set_response(self.server_class.response.HEALTH_GOOD_RESPONSE)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method enables us to get a response on the &lt;em&gt;/health&lt;/em&gt; path with the GET method, along with data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"message": "I'm doing great!"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we'll add the rest of the response methods. The logic will be exactly the same as for the &lt;em&gt;/health&lt;/em&gt; method above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def set_xml_headers(self, success_response=None):
    self.send_response(200)
    if success_response is not None:
        self.send_header("Content-type", "text/plain")
        self.send_header("Content-Length", str(len(success_response)))
    self.end_headers()


def default_response(self):
    """
    Implementation for default server response.
    """
    self.set_json_headers(self.server_class.response.DEFAULT_RESPONSE)
    self.set_response(self.server_class.response.DEFAULT_RESPONSE)


def json_response(self):
    """
    Response with json test data stored in runtime.
    """
    self.set_json_headers(self.response_json_data)
    self.set_response(self.response_json_data)


def xml_response(self):
    """
    Response with xml test data stored in runtime.
    """
    self.set_xml_headers(self.response_xml_data)
    self.set_response(self.response_xml_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhaps the "trickiest" part of this server is the store methods. We want these methods to receive data and store it in runtime, so it can be sent back upon request. This method gives a full response, and additionally, we need to save data to our class Storage variables. Here, it's necessary to parse data length from the &lt;em&gt;Content-Length&lt;/em&gt; and read the data itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def store_json_test_data(self):
    """
    Store test data in runtime. Use it to upload a new one.
    """
    success_response = self.server_class.response.GOOD_RESPONSE
    self.set_json_headers(success_response)
    self.set_response(success_response)

    if self.headers.get('Content-Length') is not None:
        self.server_class.storage.write_json(self.rfile.read(int(self.headers['Content-Length'])).decode())


def store_xml_test_data(self):
    """
    Store test data in runtime. Use it to upload a new one.
    """
    success_response = self.server_class.response.GOOD_RESPONSE
    self.set_json_headers(success_response)
    self.set_response(success_response)

    if self.headers.get('Content-Length') is not None:
        self.server_class.storage.write_xml(self.rfile.read(int(self.headers['Content-Length'])).decode())

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are now good to go. Launch the server and use the following links to open it in your browser. Doing so will trigger the method execution. Try sending data to it and receiving it back:&lt;br&gt;
&lt;a href="http://0.0.0.0/health"&gt;http://0.0.0.0/health&lt;/a&gt;&lt;br&gt;
&lt;a href="http://0.0.0.0/some_path"&gt;http://0.0.0.0/some_path&lt;/a&gt;&lt;br&gt;
&lt;a href="http://0.0.0.0/json"&gt;http://0.0.0.0/json&lt;/a&gt;&lt;br&gt;
&lt;a href="http://0.0.0.0/xml"&gt;http://0.0.0.0/xml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, let's enhance our &lt;em&gt;default_response&lt;/em&gt; and "help" message with a handy feature. I'd like for it to display all available paths in its response data. To achieve this, we need to add a method to our Path class. Fortunately, the &lt;a href="https://docs.python.org/3/library/inspect.html"&gt;Inspect&lt;/a&gt; library will do all the heavy lifting for us.&lt;br&gt;
This method examines all class attributes, filters them by "__" symbols, and returns our paths as a list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@staticmethod
def get_paths():
    return [attr_pair[1] for attr_pair in
            inspect.getmembers(Path, lambda attr_name: not (inspect.isroutine(attr_name))) if
            not (attr_pair[0].startswith('__') and attr_pair[0].endswith('__'))]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we add new code in the &lt;em&gt;DEFAULT_RESPONSE&lt;/em&gt; definition to incorporate our new data into the output strings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEFAULT_RESPONSE = dumps({"message": "Hello there. This is a default server response. Try valid URLs: {0}".format(
        Path.get_paths())})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;em&gt;ArgumentParser&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parser = argparse.ArgumentParser(description="Run a simple HTTP server. List of available paths: {0}".format(
    Path.get_paths()))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have useful information from the default server response. It guides users to the right paths.&lt;br&gt;
Try &lt;a href="http://0.0.0.0/some_path"&gt;http://0.0.0.0/some_path&lt;/a&gt; in your browser&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"message": "Hello there. This is a default server response. Try valid URLs: ['/health', '/json', '/xml']"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, our server is up and running, and easy to use. All the code can be found in the &lt;a href="https://github.com/Bartk0/base_http_server"&gt;repo&lt;/a&gt; with some basic unit tests as a bonus. This should help you safely modify it for your needs.&lt;/p&gt;

</description>
      <category>python</category>
      <category>basehttp</category>
      <category>mock</category>
      <category>automation</category>
    </item>
    <item>
      <title>Priority and Severity of tasks and bugs</title>
      <dc:creator>Artem Tregub</dc:creator>
      <pubDate>Mon, 03 Jul 2023 11:55:10 +0000</pubDate>
      <link>https://dev.to/pie_tester/priority-and-severity-of-tasks-and-bugs-1ek1</link>
      <guid>https://dev.to/pie_tester/priority-and-severity-of-tasks-and-bugs-1ek1</guid>
      <description>&lt;h2&gt;
  
  
  Priority and Severity of tasks and bugs
&lt;/h2&gt;

&lt;p&gt;Priority and Severity of tasks and bugs identified during the testing life cycle are two essential notions of risk assessment that are often considered to have the same meaning. However, differentiation of these attributes is significant in the development process because allocating them to issues helps effectively determine the order in which release tasks are to be performed. This article will cover defining Priority and Severity, setting Priority and Severity for defects, creating a Priority/Severity matrix and giving some useful tips for implementing the matrix into your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definition of Severity and Priority
&lt;/h2&gt;

&lt;p&gt;Along with other properties such as release or fix version, sprint version, description of system behaviour, etc. of issues in a task tracking system, Priority and Severity are still the most practiced through the release management processes. To clearly understand them, definitions of terms will be given below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Priority and its levels
&lt;/h2&gt;

&lt;p&gt;Priority is the order in which a bug/task should be resolved. In other words, Priority shows the importance or urgency of fixing defects and implementing issues. This attribute depends on the Severity of the product systems and the business necessities.&lt;br&gt;
Priority levels can be divided as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low&lt;/strong&gt; - a defect/task can be fixed last or can not be fixed at all;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt; - a defect/task should be resolved in the subsequent builds with consideration to the tasks queue;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High&lt;/strong&gt; - a defect/task must be resolved as a first priority since it blocks overall or affects critical functionality of the product, but it has a temporary solution or workaround;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocker&lt;/strong&gt; - a defect/task must be resolved immediately since it blocks overall or affects critical functionality of the product and it does not have a temporary solution or workaround.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Severity and its levels
&lt;/h2&gt;

&lt;p&gt;Severity is the level of impact of a task/bug on a product. The Severity level indicates to what extent issues and glitches affect the functions, performance or public perception of the product.&lt;br&gt;
Severity can be of following levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low&lt;/strong&gt; - a defect/task does not have an impact on the functionality or image of the product;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt; - a defect/task has a small impact on the functionality or image of the product;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High&lt;/strong&gt; - a defect/task has a significant impact on the functionality or image of the product, but it has a workaround or temporary solution. In addition, this affects the number of end users allowed (a certain percentage);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocker&lt;/strong&gt; - a defect/task blocks overall or affects critical functionality or image of the product badly. It does not have a temporary solution or workaround. Moreover, this affects an unacceptable number of end users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Priority and Severity setting
&lt;/h2&gt;

&lt;p&gt;Typically, having detected certain bugs through the process of testing, a QA team assigns both Priority and Severity attributes to each defect to indicate the extent to which they affect the project's systems. Since Severity represents an eventual impact, QA engineers identify systems and their functionality affected by the bug, assess the presence of a workaround and evaluate the number of audiences under this effect. It helps determine the Severity level correctly. However, this level can be changed in the assessment procedure by stakeholders because they have an understanding of the system as a whole from a business point of view.&lt;br&gt;
Although the QA team has already set the initial level of Priority during the test cycle, a Product Owner or a Project Manager defines the final order in which the bugs and tasks will be performed in a sprint by a development team. &lt;br&gt;
It could seem that Priority completely depends on the level of Severity, however, Severity is the coefficient which may increase the level of Priority and decrease it as well. The following will show how easy it is to set the Severity for bugs.&lt;br&gt;
Nevertheless, before setting the level it is necessary to recognize which components of the project are crucial from different points of view such as business, legislation, privacy, functionality, data, etc. This list of key systems should be allocated together with stakeholders and it should be fixed in the documentation of the project, for example, in a confluence page where every team member can see information about each component and its level of criticality.&lt;br&gt;
As an example, the following critical systems can be distinguished:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything about &lt;em&gt;money&lt;/em&gt; (e.g. order confirmation for an online marketplace);&lt;/li&gt;
&lt;li&gt;Everything about &lt;em&gt;data&lt;/em&gt; (e.g. payment data);&lt;/li&gt;
&lt;li&gt;Everything about &lt;em&gt;legislation&lt;/em&gt; or &lt;em&gt;legal&lt;/em&gt; area (e.g. user agreement);&lt;/li&gt;
&lt;li&gt;Any kind of &lt;em&gt;core&lt;/em&gt; functionality (e.g. market data collection for brokers);&lt;/li&gt;
&lt;li&gt;Functional &lt;em&gt;safety&lt;/em&gt; (e.g. airbags for cars);&lt;/li&gt;
&lt;li&gt;Cyber &lt;em&gt;security&lt;/em&gt; (e.g.personal data).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Easy checklist to set Severity for a bug
&lt;/h2&gt;

&lt;p&gt;There are several questions which should be asked in order to set the level properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it affect &lt;em&gt;safety&lt;/em&gt; or &lt;em&gt;privacy&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;Is an impacted system &lt;em&gt;crucial&lt;/em&gt; to a product?&lt;/li&gt;
&lt;li&gt;Is there a &lt;em&gt;workaround&lt;/em&gt; or &lt;em&gt;temporary solution&lt;/em&gt; for an issue? Can any user use this solution?&lt;/li&gt;
&lt;li&gt;How many &lt;em&gt;users&lt;/em&gt; are affected?&lt;/li&gt;
&lt;li&gt;Is influence critical to a &lt;em&gt;product's image&lt;/em&gt;? Could this negatively affect the &lt;em&gt;product&lt;/em&gt; or &lt;em&gt;business&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;Does it have an impact on business &lt;em&gt;partners&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;Does a problem increase the company's &lt;em&gt;legal&lt;/em&gt; risks?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to the list of declared critical systems and the list of questions, QA specialists can select the appropriate level of Severity for each defect and set it in a task-tracking system along with its Priority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Priority/Severity matrix
&lt;/h2&gt;

&lt;p&gt;Since the level of Severity influences Priority, the final level of urgency must be adjusted. Before the correction, stakeholders and a tech team should arrange the interconnection of levels of both attributes. Regardless of common levels of Priority and Severity that were mentioned previously, they might have other names than “high”, “low”, etc. and can be named as “crucial” or “trivial” because it directly depends on terminology in your project. However, the most convenient approach is if attributes will have the same name and degrees of criticality because it facilitates comprehension and assignment of the estimate. Moreover, to simplify the application, the definitive level of Priority of tasks or defects creates the matrix of mapping Priority and Severity. An instance of such a matrix is given 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcrlejqku5hm6wdvy92p.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%2Fuploads%2Farticles%2Fzcrlejqku5hm6wdvy92p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create your own Priority/Severity matrix
&lt;/h2&gt;

&lt;p&gt;The following steps may help facilitate the creation of the matrix for your own project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a default matrix in the first step;&lt;/li&gt;
&lt;li&gt;Adapt it to your project Priority levels and names;&lt;/li&gt;
&lt;li&gt;Decompose your project to systems;&lt;/li&gt;
&lt;li&gt;Define the list of critical systems of your project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firstly, according to this approach, taking and adapting an already finished matrix allows you to focus on filling the list of urgency which is associated with your project instead of generating ideas about the representation form of the matrix.&lt;br&gt;
Secondly, in cooperation with development and QA teams, you should determine all systems that are included in the project. Last but not least, note the most crucial components which require scrutiny in the processes of development and testing.&lt;br&gt;
After implementing these steps, you get the matrix which reflects the dependence of Priority and Severity and the catalogue of the most important parts of your product. Both received artifacts allow your team to set proper levels of urgency for tasks and bugs correctly and will act as an argument in case of disagreements with stakeholders when choosing one or another level.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to implement a new process to your project
&lt;/h2&gt;

&lt;p&gt;Here is the way to include a new process for working with the matrix of Priority and Severity in your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Present the concept to your project manager.
Your management should realize how a new process might improve the estimation of tasks and defects during a release procedure and facilitate interconnection with tech teams, especially, in cases of disputes about the priority of implementation issues or fixing bugs.&lt;/li&gt;
&lt;li&gt;Show an adapted matrix and the list of critical systems for your project. It allows you to arrange with the management a choice of approach to evaluation and accept the scroll of components which will be under control.&lt;/li&gt;
&lt;li&gt;Pursue the goal of improving bug/tasks management. Point specifically to the fact that this process will be in your area of responsibility. It is important to show your management that you will lead and keep under control the enhancement of an evaluation process in your team.&lt;/li&gt;
&lt;li&gt;Discuss. Find an optimal formula for your project together. Frequently, any changes in the process face resistance from management and other team members. It requires time and negotiations to come to a common point of view on the process and accomplish success in building a new assessment procedure.&lt;/li&gt;
&lt;li&gt;Create a wiki/confluence page to consolidate a final formula. Fixing agreements is a significant point that allows your team to avoid violations of the evaluation process in the future.&lt;/li&gt;
&lt;li&gt;Create a Severity field in your task tracker system for your project. For example, Jira does not have a Severity field in basic settings and you should ask a relevant department to set this attribute and its values in the task tracker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Priority and Severity are attributes on which the assessment of the impact of tasks and defects on the product is based. As was already mentioned, Priority is the position of an issue in the queue, while Severity affects Priority and may decrease or increase precedence and correct it. Furthermore, the Priority/Severity matrix is an instrument to manage bugs and tasks arrangement. This is especially useful for a project with plenty of bugs and tasks, and in this sense, understanding and the ability to arrange and incorporate the process suitable for your particular project is essential. &lt;/p&gt;

</description>
      <category>testing</category>
      <category>discuss</category>
      <category>bugs</category>
      <category>tasks</category>
    </item>
  </channel>
</rss>
