From 76482aca5010add599051469b7c2d519bf3bfcf4 Mon Sep 17 00:00:00 2001 From: Marco Schmid Date: Tue, 21 Apr 2026 21:40:56 +0200 Subject: [PATCH] Task 8: multiprocessing --- main.py | 16 ++++++--- ...test_overpass.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 4115 bytes tests/test_overpass.py | 33 ++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 tests/__pycache__/test_overpass.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/test_overpass.py diff --git a/main.py b/main.py index a4a1441..5df8d3c 100644 --- a/main.py +++ b/main.py @@ -105,10 +105,18 @@ if __name__ == "__main__": # Was ist passiert? - # * eigenes Modul 'utils' mit Funktion 'store_to_disk()', welche für die Speicherung der Daten zuständig ist. + # * Wir haben einen ersten Test im Modul 'tests' geschrieben + # * Der Kern von fetch_overpass() ist ein HTTP-Request — ohne Mocks lässt sich die Funktion selbst kaum sinnvoll testen, + # weil jeder Test auf die echte API angewiesen wäre (langsam, flaky, Netzwerkabhängig). + # -> deshalb war nun der erste Test (zum eigentlich weniger wichtigen) 'store_to_disk' ...! + # TASK: - # * Bis jetzt haben wir nur Code geschrieben, aber keine Tests... Das holen wir jetzt nach! - # -> Überlegt: Was für Tests könnten geschrieben werden? Was macht Sinn? Schreibt 1-2 euerer Tests. Erstellt - # dazu wie gewöhnlich den Order tests und speichert darin eure Tests (mit pytest) \ No newline at end of file + # * Wir arbeiten nun alle 4,9, 16 Sequenzen hintereinander seriell ab. Wir könnten versuchen den ganzen Prozess zu + # beschleunigen und ihn parallel auszuführen... + # * Es gibt je nach Problem verschiedene Möglichkeiten unseren Code zu parallelisieren -> beide haben Vor- und Nachteile! + # - Multithreating + # - Multiprocessing + # -> wir beginnen mit dem Multiprocessing-Ansatz (multiprocessing). Dazu bauen wir wieder ein neues model namens 'worker' + # wo wir unseren Code für die Parallelisierung ablegen. \ No newline at end of file diff --git a/tests/__pycache__/test_overpass.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_overpass.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b791566e7454e6de76e7bd303d76be23c423c41 GIT binary patch literal 4115 zcmdrPTWlOx_0Gfl^!l->9Xo69ZroQUIJE%aNh+%7mC6P zywc&zm>oj}k7yK6c#!%oLbx9%*Frx3O2miSb6fHv5Y-eyYfktW$4Ymb&xgiPQ7Cxt z>043;JEVGi-u4`nTH?T`wv9(~i@uFd*K0&6UzAk@uGo_1=t!t32;lnY9>OY247dRg2u_Ctum3{as z#(Z6R9P{i~@ESxGU5giaC(E;bm8-vftSpO=<&o8&1hPE(segfS-*4Zy$NB_QN7JHmL-}GZS z&W%5)eqJ+}IXK&GF5qL^kntUR*Uu8sI!e=N4gI;0=jML#YLF@75VPu63gQ$O-u ziU~ggpUBzcbK+-mqEk)1_*wj1vDd4nz9;B9eZDS#_PS02y3W@s{Bbmn{JK$LS1iK; zB7?Hdbe3`daETEGnDCjx8v!8|&tV zL3OFi7OkxsvH7ZM3z}lVVCX^}U-f|O zv_m@MlK}8YrzJB--l&?E8M}2tirunfrgDR*a!s)|z@AXsI?aYNY?$00@LiETKXP9- z4PD|s;-{x2ZhM@W`!_~dTw=Gf)2=54$&>`jwrP442By8R-4pQsyadsyZJpols$1n# zQ*h9W5WQrmRlNd+lFSge?yCcvc1SZ6m8ig{kximoro^`mbm)f2&>^r2icT{{XZ^4M z&<@K9wlo2Lw!J>boYIIciH>IG-~=1avf*5ZjVagvDXG^MS&S$1O3P(5``g+SM+T+xhmMU$P{ipr)^CX8(NTyfG}HS{@3 z4Qd~e%Ld(4ESbDf(-d8?V1=?%u-z|%1%T%rVehAEe;8lf+O zdvSQo75Kz&qYuR1har?4y7QIyj=leKWBIkls@hm0%}9B_e-MZ#-@o4Y!nMZr^~Q3k z8Brg034Nj4SN|SE$;^J=(0+ev|48a@VKEuHz3{Lbbr0^vN1E}GhL~=|NAAVb0PM!o zdt%4k6w^B|v}gfr*Aa79?lHJS4Cr^o^nQHctxIoSYKVnKy5Nq@cwtZU?z>`P=TZxE zfnA`1J&&W=#@K?#e9zI>Vrl_E|5NnHTbVaA-+z85(~O>cPucGucxU+A!*?dWJF*k{ zP(ZQIKm@y!Z?87vqkE!v-xWu9&b2TX*zKS-J202yzBu~!YD)?@0$7U-s(%;n*}3t} ziw!Y#=eRR8Mx6Za`%?`{Z-v_B1K@J}SQC}TszH_|A(*k}Y zrap{9816?;eq^%q$}cY^m&S!(kH?lShNT$n6<$-J&%vTSEV~^g=YCkw4sw*-q*aU9 z(H4nqDh`dZebf%QA~rPMs%AQU%cO X`y)c%KwnS%9%T-agWL%H94!0`WWgSM literal 0 HcmV?d00001 diff --git a/tests/test_overpass.py b/tests/test_overpass.py new file mode 100644 index 0000000..c886a1b --- /dev/null +++ b/tests/test_overpass.py @@ -0,0 +1,33 @@ +import pytest +from utils import store_to_disk + +# tmp_path ist ein pytest-Fixture — d.h. pytest stellt ihn automatisch bereit, ohne dass man ihn importieren muss. +# pytest startet +# → sieht Parameter "tmp_path" in der Funktionssignatur +# → erstellt automatisch ein temporäres Verzeichnis (z.B. /tmp/pytest-123/test_store_0/) +# → übergibt es als Path-Objekt an die Testfunktion +# → löscht es nach dem Test wieder + +def test_store_to_disk_creates_file(tmp_path): + """Stellt sicher, dass store_to_disk eine lesbare JSON-Datei erstellt.""" + import json + + elements = [ + {"type": "node", "id": 1, "lat": 46.1835291, "lon": 6.8346732, "tags": {"name": "Jakobshorn"}}, + {"type": "way", "id": 2, "lat": 46.1772269, "lon": 6.8402226, "tags": {"name": "Parsenn"}}, + ] + + saved_path = store_to_disk( + results=elements, + poi_type="bergbahn", + output_dir=tmp_path, + ) + + assert saved_path.exists() + assert saved_path.name == "bergbahn_results.json" + + with saved_path.open(encoding="utf-8") as f: + loaded = json.load(f) + + assert loaded == elements # Inhalt identisch + assert len(loaded) == 2 \ No newline at end of file