CI: run unittests in parallel with xdist (#29756)

* parallel tests

* review suggesions

* add to pyproject

* add a bit more buffer on that

* fix rare athena issue

* remove from pypoetry
pull/29793/head
Justin Newberry 2 years ago committed by GitHub
parent fb06b98667
commit dde225221e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/selfdrive_tests.yaml
  2. 5
      selfdrive/athena/athenad.py
  3. 2
      selfdrive/car/tests/test_lateral_limits.py
  4. 23
      selfdrive/controls/tests/test_cruise_speed.py
  5. 2
      system/tests/test_logmessaged.py

@ -249,7 +249,7 @@ jobs:
timeout-minutes: 40 timeout-minutes: 40
run: | run: |
${{ env.RUN }} "export SKIP_LONG_TESTS=1 && \ ${{ env.RUN }} "export SKIP_LONG_TESTS=1 && \
$PYTEST && \ $PYTEST -n auto --dist=loadscope && \
selfdrive/locationd/test/_test_locationd_lib.py && \ selfdrive/locationd/test/_test_locationd_lib.py && \
./system/ubloxd/tests/test_glonass_runner && \ ./system/ubloxd/tests/test_glonass_runner && \
./selfdrive/ui/tests/create_test_translations.sh && \ ./selfdrive/ui/tests/create_test_translations.sh && \

@ -119,12 +119,11 @@ class AbortTransferException(Exception):
class UploadQueueCache: class UploadQueueCache:
params = Params()
@staticmethod @staticmethod
def initialize(upload_queue: Queue[UploadItem]) -> None: def initialize(upload_queue: Queue[UploadItem]) -> None:
try: try:
upload_queue_json = UploadQueueCache.params.get("AthenadUploadQueue") upload_queue_json = Params().get("AthenadUploadQueue")
if upload_queue_json is not None: if upload_queue_json is not None:
for item in json.loads(upload_queue_json): for item in json.loads(upload_queue_json):
upload_queue.put(UploadItem.from_dict(item)) upload_queue.put(UploadItem.from_dict(item))
@ -136,7 +135,7 @@ class UploadQueueCache:
try: try:
queue: List[Optional[UploadItem]] = list(upload_queue.queue) queue: List[Optional[UploadItem]] = list(upload_queue.queue)
items = [asdict(i) for i in queue if i is not None and (i.id not in cancelled_uploads)] items = [asdict(i) for i in queue if i is not None and (i.id not in cancelled_uploads)]
UploadQueueCache.params.put("AthenadUploadQueue", json.dumps(items)) Params().put("AthenadUploadQueue", json.dumps(items))
except Exception: except Exception:
cloudlog.exception("athena.UploadQueueCache.cache.exception") cloudlog.exception("athena.UploadQueueCache.cache.exception")

@ -32,7 +32,7 @@ ABOVE_LIMITS_CARS = [
car_model_jerks: DefaultDict[str, Dict[str, float]] = defaultdict(dict) car_model_jerks: DefaultDict[str, Dict[str, float]] = defaultdict(dict)
@parameterized_class('car_model', [(c,) for c in CAR_MODELS]) @parameterized_class('car_model', [(c,) for c in sorted(CAR_MODELS)])
class TestLateralLimits(unittest.TestCase): class TestLateralLimits(unittest.TestCase):
car_model: str car_model: str

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import itertools
import numpy as np import numpy as np
import unittest import unittest
@ -31,21 +32,19 @@ def run_cruise_simulation(cruise, e2e, t_end=20.):
return output[-1, 3] return output[-1, 3]
@parameterized_class(("e2e", "personality", "speed"), itertools.product(
[True, False], # e2e
log.LongitudinalPersonality.schema.enumerants, # personality
[5,35])) # speed
class TestCruiseSpeed(unittest.TestCase): class TestCruiseSpeed(unittest.TestCase):
def test_cruise_speed(self): def test_cruise_speed(self):
params = Params() params = Params()
personalities = [log.LongitudinalPersonality.relaxed, params.put("LongitudinalPersonality", str(self.personality))
log.LongitudinalPersonality.standard, print(f'Testing {self.speed} m/s')
log.LongitudinalPersonality.aggressive] cruise_speed = float(self.speed)
for personality in personalities:
params.put("LongitudinalPersonality", str(personality)) simulation_steady_state = run_cruise_simulation(cruise_speed, self.e2e)
for e2e in [False, True]: self.assertAlmostEqual(simulation_steady_state, cruise_speed, delta=.01, msg=f'Did not reach {self.speed} m/s')
for speed in [5,35]:
print(f'Testing {speed} m/s')
cruise_speed = float(speed)
simulation_steady_state = run_cruise_simulation(cruise_speed, e2e)
self.assertAlmostEqual(simulation_steady_state, cruise_speed, delta=.01, msg=f'Did not reach {speed} m/s')
# TODO: test pcmCruise # TODO: test pcmCruise

@ -21,7 +21,7 @@ class TestLogmessaged(unittest.TestCase):
self.error_sock = messaging.sub_sock("logMessage", timeout=1000, conflate=False) self.error_sock = messaging.sub_sock("logMessage", timeout=1000, conflate=False)
# ensure sockets are connected # ensure sockets are connected
time.sleep(0.2) time.sleep(1)
messaging.drain_sock(self.sock) messaging.drain_sock(self.sock)
messaging.drain_sock(self.error_sock) messaging.drain_sock(self.error_sock)

Loading…
Cancel
Save