Skip to content

Commit d809411

Browse files
committed
Adds tests
1 parent 3df7b39 commit d809411

File tree

8 files changed

+150
-15
lines changed

8 files changed

+150
-15
lines changed

.github/workflows/python.yml

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Python CI
2+
3+
on:
4+
push:
5+
branches: [ publish ]
6+
pull_request:
7+
branches: [ publish ]
8+
9+
jobs:
10+
build:
11+
runs-on: 'ubuntu-20.04'
12+
13+
steps:
14+
- uses: 'actions/checkout@v2'
15+
16+
- name: 'Use Python 3.9'
17+
uses: 'actions/setup-python@v2'
18+
with:
19+
python-version: '3.9'
20+
21+
- name: 'Installs requirements.txt'
22+
run: pip install -r ./requirements.txt
23+
24+
- name: 'Prep Tests'
25+
run: bash ./prep.sh
26+
27+
- name: 'Run Tests'
28+
run: nose2 -v --config ./unittest.cfg main_test
29+
30+
- name: 'Publish Tests'
31+
uses: 'dorny/test-reporter@v1'
32+
# run this step even if previous step failed
33+
if: ${{ !env.ACT }} && (success() || failure())
34+
with:
35+
name: Tests
36+
path: 'nose2-junit.xml'
37+
reporter: java-junit

flask_app.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from flask import Flask
2+
3+
app = Flask(__name__)
4+
5+
@app.route("/")
6+
def ok():
7+
return "1"
8+
9+
@app.route("/fail")
10+
def not_found():
11+
return "0", 404

locust_test.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from locust import HttpUser, task
2+
3+
class LocustUser(HttpUser):
4+
@task
5+
def ok(self):
6+
self.client.get("/")
7+
8+
@task
9+
def not_found(self):
10+
self.client.get("/fail")

main.py

+11-15
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def main(argv):
1212
prefix = ''
1313

1414
try:
15-
opts, _ = getopt.getopt(sys.argv[1:], 'hp:', ['prefix='])
15+
opts, _ = getopt.getopt(argv, 'hp:', ['prefix='])
1616
except getopt.GetoptError:
1717
print('main.py -p <prefix>')
1818
sys.exit(2)
@@ -57,25 +57,21 @@ def append_testcases(prefix, testsuite):
5757
with open(csv_file_path, mode='r') as csv_file:
5858
csv_reader = csv.DictReader(csv_file)
5959

60-
line_count = 0
6160
for row in csv_reader:
6261

63-
if line_count > 0:
64-
row_method = row['Type']
65-
row_name = row['Name']
62+
row_method = row['Type']
63+
row_name = row['Name']
6664

67-
if row_method != 'None' and row_name != 'Total':
68-
testcase = ET.SubElement(testsuite, 'testcase')
65+
if row_method != '' and row_method != 'None' and row_name != 'Total':
66+
testcase = ET.SubElement(testsuite, 'testcase')
6967

70-
name = f'{row_method}\t{row_name} Average response time'
71-
testcase.set('name', name)
68+
name = f'{row_method}\t{row_name} Average response time'
69+
testcase.set('name', name)
7270

73-
test_count += int(row['Request Count'])
74-
failure_count += int(row['Failure Count'])
75-
avg_response_s = float(row['Average Response Time']) / 1000
76-
testcase.set('time', str(avg_response_s))
77-
78-
line_count += 1
71+
test_count += int(row['Request Count'])
72+
failure_count += int(row['Failure Count'])
73+
avg_response_s = float(row['Average Response Time']) / 1000
74+
testcase.set('time', str(avg_response_s))
7975

8076
testsuite.set('tests', str(test_count))
8177
testsuite.set('failures', str(failure_count))

main_test.py

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from main import main
2+
import junitparser
3+
import os
4+
import unittest
5+
6+
def convert_results(prefix: str) -> str:
7+
xml_file_path = os.path.join(
8+
os.getcwd(),
9+
'test_results.xml'
10+
)
11+
if os.path.isfile(xml_file_path):
12+
os.remove(xml_file_path)
13+
14+
argv = [
15+
'--prefix', prefix
16+
]
17+
main(argv)
18+
return xml_file_path
19+
20+
class TestMain(unittest.TestCase):
21+
22+
def assert_file(self, prefix: str, test_case_names: list[str]) -> None:
23+
xml_file_path = convert_results(prefix)
24+
self.assertTrue(os.path.isfile(xml_file_path))
25+
26+
junit_xml = junitparser.JUnitXml.fromfile(xml_file_path)
27+
28+
test_suites = list(junit_xml)
29+
self.assertEqual(len(test_suites), 1)
30+
31+
test_suite = test_suites[0]
32+
self.assertEqual(test_suite.name, 'Locust Tests')
33+
self.assertGreater(test_suite.tests, 0)
34+
self.assertGreater(test_suite.failures, 0)
35+
36+
test_cases = list(test_suite)
37+
self.assertEqual(len(test_cases), len(test_case_names))
38+
39+
for index, test_case_name in enumerate(test_case_names):
40+
self.assertEqual(test_cases[index].name, test_case_name)
41+
self.assertEqual(type(test_cases[index].time), float)
42+
43+
return
44+
45+
def test_conversion(self):
46+
self.assert_file('prefix1', [
47+
'GET\t/ Average response time',
48+
'GET\t/fail Average response time',
49+
])
50+
51+
self.assert_file('prefix2', [
52+
'GET\t/ Average response time',
53+
'GET\t/fail Average response time',
54+
])
55+
return
56+
57+
if __name__ == '__main__':
58+
unittest.main()

prep.sh

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
set_return() { return $1; }
4+
FLASK_APP=flask_app.py flask run > /dev/null &
5+
FLASK_PID=$!
6+
7+
locust -f locust_test.py --csv=prefix1 --headless -t20s --host http://localhost:5000 > /dev/null
8+
locust -f locust_test.py --csv=prefix2 --headless -t20s --host http://localhost:5000 > /dev/null
9+
10+
kill $FLASK_PID
11+
set_return 0

requirements.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Flask==2.0.2
2+
junitparser==2.1.1
3+
locust==2.4.3
4+
nose2==0.10.0

unittest.cfg

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[unittest]
2+
plugins = nose2.plugins.junitxml
3+
4+
[junit-xml]
5+
always-on = True
6+
keep_restricted = False
7+
path = nose2-junit.xml
8+
test_fullname = True

0 commit comments

Comments
 (0)