#!/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())