diff options
Diffstat (limited to 't')
| -rw-r--r-- | t/async-generator-and-comprehension.py | 20 | ||||
| -rw-r--r-- | t/test_functionality.py | 56 | ||||
| -rw-r--r-- | t/utils.py | 36 |
3 files changed, 77 insertions, 35 deletions
diff --git a/t/async-generator-and-comprehension.py b/t/async-generator-and-comprehension.py deleted file mode 100644 index 2e1b60b..0000000 --- a/t/async-generator-and-comprehension.py +++ /dev/null @@ -1,20 +0,0 @@ -import asyncio -import yappi - - -async def async_generator(): - for i in range(10): - await asyncio.sleep(0.5) - yield i - - -async def main(): - r = [a async for a in async_generator()] - print(sum(r)) - - -yappi.set_clock_type("wall") -yappi.start() -asyncio.run(main()) -yappi.get_func_stats().print_all() -yappi.get_thread_stats().print_all() diff --git a/t/test_functionality.py b/t/test_functionality.py index f0fa6ed..0302a90 100644 --- a/t/test_functionality.py +++ b/t/test_functionality.py @@ -1,7 +1,16 @@ +try: + import yappi +except ImportError: + print("yappi module not found. Skipping related tests.") + exit(0) import utils import asyncio import threading +# A test file containing basic async functionality tests. Compares the results +# of Aergia to both a calculated expected time and yappi reported time, done +# simply to draw comparisons between the two approaches. + class TerminateTaskGroup(Exception): '''Exception raised to terminate a task group.''' @@ -39,10 +48,15 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() - samples = self.Aergia.get_samples() + yappi_samples = yappi.get_func_stats() + aergia_samples = self.Aergia.get_samples() - self.assert_reasonable_delay('b', delay * num_times, samples) + self.assert_reasonable_delay('b', delay * num_times, aergia_samples) + self.assert_similar_delay('b', yappi_samples, aergia_samples) def test_simultaneous_tasks(self): delay = 0.2 @@ -52,15 +66,22 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() - samples = self.Aergia.get_samples() + yappi_samples = yappi.get_func_stats() + aergia_samples = self.Aergia.get_samples() - self.assert_reasonable_delay('b', delay * 3, samples) + self.assert_reasonable_delay('b', delay * 3, aergia_samples) # the gather function is technically waiting for all tasks to finish. # This might be seen as unintuitive though I don't want to bias the # results by adding logic to add artificial consistency. # profiling does not mean obscuring implementation details. - self.assert_reasonable_delay('a', delay, samples) + self.assert_reasonable_delay('a', delay, aergia_samples) + + self.assert_similar_delay('b', yappi_samples, aergia_samples) + self.assert_similar_delay('a', yappi_samples, aergia_samples) def test_subthread_task(self): delay = 0.2 @@ -74,6 +95,11 @@ class BasicUsage(utils.AergiaUnitTestCase): x.start() x.join() self.Aergia.stop() + yappi.start() + x = threading.Thread(target=c) + x.start() + x.join() + yappi.stop() samples = self.Aergia.get_samples() self.assert_reasonable_delay('c', 0, samples) @@ -91,6 +117,9 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() samples = self.Aergia.get_samples() self.assert_reasonable_delay('a', delay, samples) @@ -112,6 +141,9 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() samples = self.Aergia.get_samples() self.assert_reasonable_delay('a', d1 + d2 + d3 + d4, samples) @@ -180,6 +212,9 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() samples = self.Aergia.get_samples() @@ -205,6 +240,9 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() samples = self.Aergia.get_samples() @@ -242,6 +280,9 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a()) self.Aergia.stop() + yappi.start() + asyncio.run(a()) + yappi.stop() samples = self.Aergia.get_samples() @@ -265,5 +306,8 @@ class BasicUsage(utils.AergiaUnitTestCase): self.Aergia.start() asyncio.run(a(3)) self.Aergia.stop() + yappi.start() + asyncio.run(a(3)) + yappi.stop() - samples = self.Aergia.get_samples() + # samples = self.Aergia.get_samples() @@ -1,4 +1,5 @@ from aergia.aergia import Aergia +import yappi import unittest @@ -6,27 +7,44 @@ class AergiaUnitTestCase(unittest.TestCase): interval = 0.01 Aergia = Aergia(interval) + # yappi is a singleton def setUp(self): self.Aergia.clear() + yappi.stop() + yappi.clear_stats() + yappi.set_clock_type('wall') + yappi.set_context_id_callback(None) + yappi.set_context_name_callback(None) + yappi.set_tag_callback(None) + def assert_reasonable_delay(self, func_name, time_expected, samples): '''Compares the results reported by Aergia for FUNC_NAME with time_expected.''' - samples_expected = self.aergia_expected_samples(time_expected) samples_actual = self.aergia_extract_values_by_func(samples, func_name) - self.assert_roughly_equal(samples_actual, samples_expected) + time_actual = self.aergia_expected_time(samples_actual) + self.assert_roughly_equal(time_actual, time_expected) + + def assert_similar_delay(self, func_name, yappi_stats, aergia_samples): + time_yappi = self.yappi_extract_values_by_func(yappi_stats, func_name) + + samples_aergia = self.aergia_extract_values_by_func( + aergia_samples, func_name) + time_aergia = self.aergia_expected_time(samples_aergia) + + self.assert_roughly_equal(time_aergia, time_yappi) def assert_roughly_equal(self, v1, v2): - '''Throws an exception if values V1 and V2 are not within 2.5 - samples of each other.''' + '''Throws an exception if values V1 and V2 are not within 0.03 + seconds of each other.''' a = abs(v1 - v2) - self.assertTrue(a <= 2.5, f'{v1} (expected) not roughly {v2} (actual)') + self.assertTrue(a <= .03, f'{v1} (expected) not roughly {v2} (actual)') - def aergia_expected_samples(self, total_seconds): - '''Given TOTAL_SECONDS, returns the expected number of samples, using - the sampling interval.''' - return (total_seconds / self.interval) + def aergia_expected_time(self, total_samples): + '''Given TOTAL_SAMPLES, returns the total time, using the + sampling interval.''' + return total_samples * self.interval def aergia_extract_values_by_func(self, samples, func_name): '''Returns the total number of samples for function name, given an |
