text: Title: during manual local testing, the processes are not killed if the test fails
  Body: We need to terminate the processes if test fails for whatsoever reason:
  
  ## Current
  ```python
  def test_e2e_default_batching(killall):
      process = subprocess.Popen(
          ["python", "tests/e2e/default_batching.py"],
          stdout=subprocess.DEVNULL,
          stderr=subprocess.DEVNULL,
          stdin=subprocess.DEVNULL,
      )
  
      time.sleep(5)
      resp = requests.post("http://127.0.0.1:8000/predict", json={"input": 4.0}, headers=None)
      assert resp.status_code == 200, f"Expected response to be 200 but got {resp.status_code}"
      assert resp.json() == {"output": 16.0}, "tests/simple_server.py didn't return expected output"
      killall(process)
  ```
  
  ## Proposed
  
  ```py
  def test_e2e_default_batching(killall):
      process = subprocess.Popen(
          ["python", "tests/e2e/default_batching.py"],
          stdout=subprocess.DEVNULL,
          stderr=subprocess.DEVNULL,
          stdin=subprocess.DEVNULL,
      )
  
      time.sleep(5)
      try:
        resp = requests.post("http://127.0.0.1:8000/predict", json={"input": 4.0}, headers=None)
        assert resp.status_code == 200, f"Expected response to be 200 but got {resp.status_code}"
        assert resp.json() == {"output": 16.0}, "tests/simple_server.py didn't return expected output"
    except Exception as e:
      raise e
    finally:  # kill the process before raising the exception
      killall(process)
  ```
  
  
  ---
  _Originally posted by @bhimrazy in https://github.com/Lightning-AI/LitServe/issues/119#issuecomment-2141734005_
              