Python - Using pytest to skip test unless specified

后端 未结 4 881
抹茶落季
抹茶落季 2020-12-31 23:12

Background

I have am using pytest to test a web scraper that pushes the data to a database. The class only pulls the html and pushes the html to a database to be p

4条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-31 23:53

    Form a little class for reuse of @xverges code on multiple marks/cli options;

    @dataclass
    class TestsWithMarkSkipper:
        ''' Util to skip tests with mark, unless cli option provided. '''
    
        test_mark: str
        cli_option_name: str
        cli_option_help: str
    
        def pytest_addoption_hook(self, parser):
            parser.addoption(
                self.cli_option_name,
                action="store_true",
                default=False,
                help=self.cli_option_help,
            )
    
        def pytest_collection_modifyitems_hook(self, config, items):
            if not config.getoption(self.cli_option_name):
                self._skip_items_with_mark(items)
    
        def _skip_items_with_mark(self, items):
            reason = "need {} option to run".format(self.cli_option_name)
            skip_marker = pytest.mark.skip(reason=reason)
            for item in items:
                if self.test_mark in item.keywords:
                    item.add_marker(skip_marker)
    

    Usage example (must be put in conftest.py):

    slow_skipper = TestsWithMarkSkipper(
        test_mark='slow',
        cli_option_name="--runslow",
        cli_option_help="run slow tests",
    )
    pytest_addoption = slow_skipper.pytest_addoption_hook
    pytest_collection_modifyitems = slow_skipper.pytest_collection_modifyitems_hook
    

提交回复
热议问题