Graphs

Data Visualisation

Required files:

test_plan.py

#!/usr/bin/env python
"""
These examples show usage of graphs
"""

import datetime
import sys
import os

from testplan.testing.multitest import MultiTest, testsuite, testcase

from testplan import test_plan
from testplan.report.testing.styles import Style, StyleEnum


@testsuite
class SampleSuite:
    # Basic graphing for singe series graphing:
    @testcase
    def graph_tests(self, env, result):
        # The last 3 arguments don't have to be keyword, however for clarity they are included.
        # A Basic single series line graph, where the line has been specified to be red,
        # and the axis have been labelled
        result.graph(
            "Line",
            {
                "Data Name": [
                    {"x": 0, "y": 8},
                    {"x": 1, "y": 5},
                    {"x": 2, "y": 4},
                    {"x": 3, "y": 9},
                    {"x": 4, "y": 1},
                    {"x": 5, "y": 7},
                    {"x": 6, "y": 6},
                    {"x": 7, "y": 3},
                    {"x": 8, "y": 2},
                    {"x": 9, "y": 0},
                ]
            },
            description="Line Graph",
            series_options={"Data Name": {"colour": "red"}},
            graph_options={"xAxisTitle": "Time", "yAxisTitle": "Failures"},
        )

        # A Basic single series scatter graph, where the points have been specified to be black
        result.graph(
            "Scatter",
            {
                "Data Name": [
                    {"x": 0, "y": 8},
                    {"x": 1, "y": 50},
                    {"x": 2, "y": 4},
                    {"x": -10, "y": 9},
                    {"x": 4, "y": 1},
                    {"x": 5, "y": 7},
                    {"x": 6, "y": -3},
                    {"x": 7, "y": 3},
                    {"x": 100, "y": 2},
                    {"x": 9, "y": 0},
                ]
            },
            description="Scatter Graph",
            series_options={"Data Name": {"colour": "black"}},
            graph_options=None,
        )

        # A single series Bar Graph, with no colour or graph preference, so a random colour will be assigned
        result.graph(
            "Bar",
            {
                "Any Name You Want": [
                    {"x": "A", "y": 10},
                    {"x": "B", "y": 5},
                    {"x": "C", "y": 15},
                ]
            },
            description="Bar Graph",
            series_options=None,
            graph_options=None,
        )

        # A simple Pie chart. Note: the colour can be set as 'literal' to make the colour
        # the same as that specified in the data structure
        result.graph(
            "Pie",
            {
                "Data Name": [
                    {"angle": 1, "color": "#89DAC1", "name": "Car"},
                    {"angle": 2, "color": "#F6D18A", "name": "Bus"},
                    {"angle": 5, "color": "#1E96BE", "name": "Train"},
                    {"angle": 3, "color": "#DA70BF", "name": "Bicycle"},
                    {"angle": 5, "color": "#F6D18A", "name": "Walking"},
                ]
            },
            description="Pie Chart",
            series_options={"Data Name": {"colour": "literal"}},
            graph_options=None,
        )

        # A Timeline (Gantt) chart. 'start'/'end' accept datetime objects or
        # ISO 8601 strings, and each series is drawn in its own colour.
        start = datetime.datetime.now()
        result.graph(
            "Timeline",
            {
                "Drivers": [
                    {
                        "name": "server",
                        "start": start,
                        "end": start + datetime.timedelta(seconds=1),
                    },
                    {
                        "name": "client",
                        "start": start + datetime.timedelta(milliseconds=200),
                        "end": start + datetime.timedelta(seconds=2),
                    },
                ],
                "Workers": [
                    {
                        "name": "worker",
                        "start": start + datetime.timedelta(seconds=1),
                        "end": start + datetime.timedelta(seconds=3),
                    },
                ],
            },
            description="Timeline Chart",
            series_options={"Drivers": {"colour": "red"}},
            graph_options={"legend": True},
        )

    # Some examples of multi series graphs:
    @testcase
    def multiseries_graph_tests(self, env, result):
        # This line graph has two data series 'graph 1' and 'graph 2' and will be plot on the same axis
        # NOTE: with multi series graphs you will often want the legend to be set to true
        # The series options have set the first data set to be red, and the second to be blue
        result.graph(
            "Line",
            {
                "graph 1": [
                    {"x": 0, "y": 8},
                    {"x": 1, "y": 5},
                    {"x": 2, "y": 4},
                    {"x": 3, "y": 9},
                    {"x": 4, "y": 1},
                    {"x": 5, "y": 7},
                    {"x": 6, "y": 6},
                    {"x": 7, "y": 3},
                    {"x": 8, "y": 2},
                    {"x": 9, "y": 0},
                ],
                "graph 2": [
                    {"x": 1, "y": 3},
                    {"x": 2, "y": 5},
                    {"x": 3, "y": 15},
                    {"x": 4, "y": 12},
                ],
            },
            description="Line Graph",
            series_options={
                "graph 1": {"colour": "red"},
                "graph 2": {"colour": "blue"},
            },
            graph_options={
                "xAxisTitle": "Time",
                "yAxisTitle": "Volume",
                "legend": True,
            },
        )

        # This is a multi series bar graph, data with the same 'x' values in
        # different data series will be plotted next to each other
        result.graph(
            "Bar",
            {
                "Bar 1": [
                    {"x": "A", "y": 10},
                    {"x": "B", "y": 5},
                    {"x": "C", "y": 15},
                ],
                "Bar 2": [
                    {"x": "A", "y": 3},
                    {"x": "B", "y": 6},
                    {"x": "C", "y": 15},
                    {"x": "D", "y": 12},
                ],
            },
            description="Bar Graph",
            series_options={
                "Bar 1": {"colour": "green"},
                "Bar 2": {"colour": "purple"},
            },
            graph_options={"legend": True},
        )


# PDF style must be 'assertion-detail' to view
# non-assertion related detail like graphs or logs
@test_plan(
    name="Assertions Example",
    stdout_style=Style(
        passing=StyleEnum.ASSERTION_DETAIL, failing=StyleEnum.ASSERTION_DETAIL
    ),
    pdf_path=os.path.join(os.path.dirname(__file__), "report.pdf"),
    pdf_style=Style(passing="assertion-detail", failing="assertion-detail"),
)
def main(plan):
    plan.add(MultiTest(name="Graph Assertions Test", suites=[SampleSuite()]))


if __name__ == "__main__":
    sys.exit(not main())