Skip to content

Reported location for assertion error is off with coverage #5754

Closed
@blueyed

Description

@blueyed

Locations for assertion errors are off when using pytest with coverage (pytest-cov):

    def test_config():
        assert False
>       assert False
E       assert False

Bisected to 39ba996.

More information (original issue):

In https://travis-ci.com/pdbpp/fancycompleter/jobs/226053243#L153 it reports this error:

================================== FAILURES ===================================
_________________________________ test_config _________________________________
tmphome = local('C:\\Users\\travis\\AppData\\Local\\Temp\\pytest-of-unknown\\pytest-0\\test_config0')
capsys = <_pytest.capture.CaptureFixture object at 0x0000026CE8AD3508>
    def test_config(tmphome, capsys):
        class DefaultCfg:
            default = 42
    
        class MyCfg(ConfigurableClass):
            DefaultConfig = DefaultCfg
            config_filename = ".mycfg"
    
        cfg = MyCfg()
    
        # Calls passed in Config.
        assert cfg.get_config(Config=lambda: "42") == "42"
    
        # Uses DefaultConfig instance.
        assert isinstance(cfg.get_config(None), DefaultCfg)
    
        cfgfile = tmphome.join(MyCfg.config_filename)
    
        # Handles empty config file (missing "Config").
        cfgfile.ensure()
        assert isinstance(cfg.get_config(None), DefaultCfg)
        out, err = capsys.readouterr()
        assert out == ""
        assert err == ""
    
        # Exception when instantiating Config.
        p = tmphome.ensure(MyCfg.config_filename)
        print(p, file=capsys._capture.out._old)
        cfgfile.write("def Config(): raise Exception('my_exc')")
        assert isinstance(cfg.get_config(None), DefaultCfg)
        out, err = capsys.readouterr()
        assert out == ""
        assert err == (
            "** error when setting up Config from ~/.mycfg: my_exc (%s:1) **\n" % p
        )
        print("passed first", file=capsys._capture.out._old)
    
        # Error during execfile.
        config_filename = tmphome.ensure(MyCfg.config_filename)
        print("config_filename:", config_filename, file=capsys._capture.out._old)
        cfgfile.write("raise Exception('my_execfile_exc')")
        assert isinstance(cfg.get_config(None), DefaultCfg)
        out, err = capsys.readouterr()
        assert out == ""
>       assert err == "** error when importing ~/.mycfg: my_execfile_exc **\n"
E       AssertionError: assert '** error whe...mycfg:1) **\n' == '** error whe...mycfg:1) **\n'
E         Skipping 119 identical leading characters in diff, use -v to show
E         - st_config0/.mycfg:1) **
E         ?           ^
E         + st_config0\.mycfg:1) **
E         ?           ^
C:\Users\travis\build\pdbpp\fancycompleter\testing\test_configurableclass.py:48: AssertionError
---------------------------- Captured stdout call -----------------------------
C:\Users\travis\AppData\Local\Temp\pytest-of-unknown\pytest-0\test_config0\.mycfg

Full log: https://travis-ci.com/pdbpp/fancycompleter/jobs/226053243#L153

Note that it reports the error with the wrong assert statement - which can be seen also by "passed first" not being included in "Captured stdout call".

With --assert=plain it is correct:

_________________________________ test_config _________________________________
tmphome = local('C:\\Users\\travis\\AppData\\Local\\Temp\\pytest-of-unknown\\pytest-0\\test_config0')
capsys = <_pytest.capture.CaptureFixture object at 0x00000170297C1CC8>
    def test_config(tmphome, capsys):
        class DefaultCfg:
            default = 42
    
        class MyCfg(ConfigurableClass):
            DefaultConfig = DefaultCfg
            config_filename = ".mycfg"
    
        cfg = MyCfg()
    
        # Calls passed in Config.
        assert cfg.get_config(Config=lambda: "42") == "42"
    
        # Uses DefaultConfig instance.
        assert isinstance(cfg.get_config(None), DefaultCfg)
    
        cfgfile = tmphome.join(MyCfg.config_filename)
    
        # Handles empty config file (missing "Config").
        cfgfile.ensure()
        assert isinstance(cfg.get_config(None), DefaultCfg)
        out, err = capsys.readouterr()
        assert out == ""
        assert err == ""
    
        # Exception when instantiating Config.
        p = tmphome.ensure(MyCfg.config_filename)
        print(p, file=capsys._capture.out._old)
        cfgfile.write("def Config(): raise Exception('my_exc')")
        assert isinstance(cfg.get_config(None), DefaultCfg)
        out, err = capsys.readouterr()
        assert out == ""
        assert err == (
>           "** error when setting up Config from ~/.mycfg: my_exc (%s:1) **\n" % p
        )
E       AssertionError
C:\Users\travis\build\pdbpp\fancycompleter\testing\test_configurableclass.py:37: AssertionError
---------------------------- Captured stdout call -----------------------------
C:\Users\travis\AppData\Local\Temp\pytest-of-unknown\pytest-0\test_config0\.mycfg

platform win32 -- Python 3.7.4, pytest-5.1.0, py-1.8.0, pluggy-0.12.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: rewriterelated to the assertion rewrite mechanismtype: bugproblem that needs to be addressedtype: regressionindicates a problem that was introduced in a release which was working previously

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions