Skip to content

Commit 5d79d22

Browse files
committedFeb 8, 2022
Add tests for async functions
Signed-off-by: Yury Pliner <yury.pliner@gmail.com>
1 parent 39d2360 commit 5d79d22

File tree

2 files changed

+90
-22
lines changed

2 files changed

+90
-22
lines changed
 

‎tests/test_core.py

+89-22
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import asyncio
12
from concurrent.futures import ThreadPoolExecutor
23
import time
34
import unittest
45

5-
import pytest
6+
import aiounittest
67

78
from prometheus_client.core import (
89
CollectorRegistry, Counter, CounterMetricFamily, Enum, Gauge,
@@ -28,7 +29,7 @@ def assert_not_observable(fn, *args, **kwargs):
2829
assert False, "Did not raise a 'missing label values' exception"
2930

3031

31-
class TestCounter(unittest.TestCase):
32+
class TestCounter(aiounittest.AsyncTestCase):
3233
def setUp(self):
3334
self.registry = CollectorRegistry()
3435
self.counter = Counter('c_total', 'help', registry=self.registry)
@@ -56,30 +57,42 @@ def f(r):
5657

5758
self.assertEqual((["r"], None, None, None), getargspec(f))
5859

59-
try:
60+
with self.assertRaises(TypeError):
6061
f(False)
61-
except TypeError:
62-
pass
6362
self.assertEqual(0, self.registry.get_sample_value('c_total'))
6463

65-
try:
64+
with self.assertRaises(ValueError):
6665
f(True)
67-
except ValueError:
68-
pass
66+
self.assertEqual(1, self.registry.get_sample_value('c_total'))
67+
68+
async def test_async_function_decorator(self):
69+
@self.counter.count_exceptions(ValueError)
70+
async def f(r):
71+
if r:
72+
raise ValueError
73+
else:
74+
raise TypeError
75+
76+
self.assertEqual((["r"], None, None, None), getargspec(f))
77+
78+
with self.assertRaises(TypeError):
79+
await f(False)
80+
81+
self.assertEqual(0, self.registry.get_sample_value('c_total'))
82+
83+
with self.assertRaises(ValueError):
84+
await f(True)
85+
6986
self.assertEqual(1, self.registry.get_sample_value('c_total'))
7087

7188
def test_block_decorator(self):
7289
with self.counter.count_exceptions():
7390
pass
7491
self.assertEqual(0, self.registry.get_sample_value('c_total'))
7592

76-
raised = False
77-
try:
93+
with self.assertRaises(ValueError):
7894
with self.counter.count_exceptions():
7995
raise ValueError
80-
except:
81-
raised = True
82-
self.assertTrue(raised)
8396
self.assertEqual(1, self.registry.get_sample_value('c_total'))
8497

8598
def test_count_exceptions_not_observable(self):
@@ -115,7 +128,7 @@ def test_exemplar_too_long(self):
115128
})
116129

117130

118-
class TestGauge(unittest.TestCase):
131+
class TestGauge(aiounittest.AsyncTestCase):
119132
def setUp(self):
120133
self.registry = CollectorRegistry()
121134
self.gauge = Gauge('g', 'help', registry=self.registry)
@@ -160,6 +173,18 @@ def f():
160173
f()
161174
self.assertEqual(0, self.registry.get_sample_value('g'))
162175

176+
async def test_inprogress_async_function_decorator(self):
177+
self.assertEqual(0, self.registry.get_sample_value('g'))
178+
179+
@self.gauge.track_inprogress()
180+
async def f():
181+
self.assertEqual(1, self.registry.get_sample_value('g'))
182+
183+
self.assertEqual(([], None, None, None), getargspec(f))
184+
185+
await f()
186+
self.assertEqual(0, self.registry.get_sample_value('g'))
187+
163188
def test_inprogress_block_decorator(self):
164189
self.assertEqual(0, self.registry.get_sample_value('g'))
165190
with self.gauge.track_inprogress():
@@ -185,12 +210,24 @@ def test_time_function_decorator(self):
185210

186211
@self.gauge.time()
187212
def f():
188-
time.sleep(.001)
213+
time.sleep(.05)
189214

190215
self.assertEqual(([], None, None, None), getargspec(f))
191216

192217
f()
193-
self.assertNotEqual(0, self.registry.get_sample_value('g'))
218+
self.assertTrue(0.05 <= self.registry.get_sample_value('g') <= 0.1)
219+
220+
async def test_time_async_function_decorator(self):
221+
self.assertEqual(0, self.registry.get_sample_value('g'))
222+
223+
@self.gauge.time()
224+
async def f():
225+
await asyncio.sleep(.05)
226+
227+
self.assertEqual(([], None, None, None), getargspec(f))
228+
229+
await f()
230+
self.assertTrue(0.05 <= self.registry.get_sample_value('g') <= 0.1)
194231

195232
def test_function_decorator_multithread(self):
196233
self.assertEqual(0, self.registry.get_sample_value('g'))
@@ -239,7 +276,7 @@ def manager():
239276
assert_not_observable(manager)
240277

241278

242-
class TestSummary(unittest.TestCase):
279+
class TestSummary(aiounittest.AsyncTestCase):
243280
def setUp(self):
244281
self.registry = CollectorRegistry()
245282
self.summary = Summary('s', 'help', registry=self.registry)
@@ -264,12 +301,26 @@ def test_function_decorator(self):
264301

265302
@self.summary.time()
266303
def f():
267-
pass
304+
time.sleep(.05)
268305

269306
self.assertEqual(([], None, None, None), getargspec(f))
270307

271308
f()
272309
self.assertEqual(1, self.registry.get_sample_value('s_count'))
310+
self.assertTrue(.05 < self.registry.get_sample_value('s_sum') < 0.1)
311+
312+
async def test_async_function_decorator(self):
313+
self.assertEqual(0, self.registry.get_sample_value('s_count'))
314+
315+
@self.summary.time()
316+
async def f():
317+
await asyncio.sleep(.05)
318+
319+
self.assertEqual(([], None, None, None), getargspec(f))
320+
321+
await f()
322+
self.assertEqual(1, self.registry.get_sample_value('s_count'))
323+
self.assertTrue(.05 < self.registry.get_sample_value('s_sum') < 0.1)
273324

274325
def test_function_decorator_multithread(self):
275326
self.assertEqual(0, self.registry.get_sample_value('s_count'))
@@ -343,7 +394,7 @@ def manager():
343394
assert_not_observable(manager)
344395

345396

346-
class TestHistogram(unittest.TestCase):
397+
class TestHistogram(aiounittest.AsyncTestCase):
347398
def setUp(self):
348399
self.registry = CollectorRegistry()
349400
self.histogram = Histogram('h', 'help', registry=self.registry)
@@ -417,13 +468,29 @@ def test_function_decorator(self):
417468

418469
@self.histogram.time()
419470
def f():
420-
pass
471+
time.sleep(.05)
421472

422473
self.assertEqual(([], None, None, None), getargspec(f))
423474

424475
f()
425476
self.assertEqual(1, self.registry.get_sample_value('h_count'))
426477
self.assertEqual(1, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
478+
self.assertTrue(.05 < self.registry.get_sample_value('h_sum') < 0.1)
479+
480+
async def test_async_function_decorator(self):
481+
self.assertEqual(0, self.registry.get_sample_value('h_count'))
482+
self.assertEqual(0, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
483+
484+
@self.histogram.time()
485+
async def f():
486+
await asyncio.sleep(.05)
487+
488+
self.assertEqual(([], None, None, None), getargspec(f))
489+
490+
await f()
491+
self.assertEqual(1, self.registry.get_sample_value('h_count'))
492+
self.assertEqual(1, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
493+
self.assertTrue(.05 < self.registry.get_sample_value('h_sum') < 0.1)
427494

428495
def test_function_decorator_multithread(self):
429496
self.assertEqual(0, self.registry.get_sample_value('h_count'))
@@ -527,7 +594,7 @@ def test_labels(self):
527594
self.assertRaises(ValueError, self.labels.state, 'a')
528595

529596
def test_overlapping_labels(self):
530-
with pytest.raises(ValueError):
597+
with self.assertRaises(ValueError):
531598
Enum('e', 'help', registry=None, labelnames=['e'])
532599

533600

@@ -568,7 +635,7 @@ def test_incorrect_label_count_raises(self):
568635
self.assertRaises(ValueError, self.counter.remove, 'a', 'b')
569636

570637
def test_labels_on_labels(self):
571-
with pytest.raises(ValueError):
638+
with self.assertRaises(ValueError):
572639
self.counter.labels('a').labels('b')
573640

574641
def test_labels_coerced_to_string(self):

‎tox.ini

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ envlist = coverage-clean,py3.6,py3.7,py3.8,py3.9,py3.10,pypy3.7,py3.9-nooptional
66
deps =
77
coverage
88
pytest
9+
aiounittest
910
attrs
1011

1112
[testenv]

0 commit comments

Comments
 (0)