docs: def run(self,
              tests: Iterable[TestCase],
              *,
              instrument: bool = True
              ) -> TestSuiteCoverage:
          """
          Computes line coverage information for a given set of tests.
  
          Parameters:
              tests: the tests for which coverage should be computed.
              instrument: if set to True, calls prepare and cleanup before and
                  after running the tests. If set to False, prepare
                  and cleanup are not called, and the responsibility of calling
                  those methods is left to the user.
          """
          container = self.container
          logger.debug("computing coverage for container: %s", container.uid)
  
          try:
              if instrument:
                  logger.debug("instrumenting container")
                  self.prepare()
              else:
                  logger.debug("not instrumenting container")
          except Exception:
              msg = "failed to instrument container."
              raise exceptions.FailedToComputeCoverage(msg)
  
          cov = {}
          for test in tests:
              logger.debug("Generating coverage for test %s in container %s",
                           test.name, container.uid)
              outcome = self.__installation.containers.execute(container, test)
              filelines = self.extract()
              test_coverage = TestCoverage(test.name, outcome, filelines)
              logger.debug("Generated coverage for test %s in container %s",
                           test.name, container.uid)
              cov[test.name] = test_coverage
  
          self.cleanup()
  
          coverage = TestSuiteCoverage(cov)
          logger.debug("Computed coverage for container: %s", container.uid)
          return coverage