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
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.