pytest: `foo is Enum.FOO` тестирует True локально, False на travis-ci - PullRequest
1 голос
/ 13 февраля 2020

Halp! У меня странные проблемы с проверкой равенства для Enums. Локально мои тесты проходят, но на Трэвисе они не проходят. Вот пример неудачного теста от Travis:

_____________________________ test_extract_object ______________________________
    def test_extract_object():
        """Test UmlCreator.extract_object()."""
        creator = UmlCreator(".")
        with pytest.raises(ValueError):
            creator.extract_object(["no", "klass", "included"])
        obj = creator.extract_object(
            [
                "public",
                "static",
                "class",
                "StaticKlass",
                ":",
                "ICanBeImplemented,",
                "IComparable,",
                "IEquatable<Klass>",
            ]
        )
        assert obj.__class__.__name__ == "UmlClass"
>       assert obj.access is Access.PUBLIC
E       assert Access("public") is Access("public")
E        +  where Access("public") = UmlClass(['StaticKlass', ':', 'ICanBeImplemented,', 'IComparable,', 'IEquatable<Klass>'], **{'nsp': None, 'access': Access("public"), 'attrs': [], 'modifiers': [Modifier("static")], 'repo_url': None}).access
E        +  and   Access("public") = Access.PUBLIC
tests/test_creator.py:44: AssertionError

Если я изменю строку с ошибкой на assert obj.access.value == Access.PUBLIC.value, она также будет проходить и на Travis, но я озадачен, почему это не удается в одном месте и проходит в другом с в основном той же настройкой, и это, конечно, также влияет на не тестовый код, а это означает, что везде, где я использую foo is Enum.VAL в своем коде, тесты для этих методов также не проходят:

tests/test_creator.py:44: AssertionError
_________________________ test_uml_class_display_name __________________________
    def test_uml_class_display_name():
        """Test UmlClass.display_name()."""
        klass = UmlClass(["Classy"])
        assert klass.display_name() == "Classy"
        abstract_klass = UmlClass(["Classy"], modifiers=[Modifier.ABSTRACT])
>       assert abstract_klass.is_abstract()
E       assert False

Local

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic
$ pip list
Package            Version
------------------ --------
appdirs            1.4.3
astroid            2.3.3
attrs              19.3.0
bandit             1.6.2
black              19.10b0
Click              7.0
coverage           5.0.3
gitdb2             2.0.6
GitPython          3.0.7
importlib-metadata 1.5.0
isort              4.3.21
lazy-object-proxy  1.4.3
mccabe             0.6.1
more-itertools     8.2.0
packaging          20.1
pathspec           0.7.0
pbr                5.4.4
pip                20.0.2
pluggy             0.13.1
py                 1.8.1
pylint             2.4.4
pyparsing          2.4.6
pytest             5.3.5
pytest-cov         2.8.1
PyYAML             5.3
regex              2020.1.8
rope               0.16.0
setuptools         45.1.0
six                1.14.0
smmap2             2.0.5
stevedore          1.32.0
toml               0.10.0
typed-ast          1.4.1
wcwidth            0.1.8
wheel              0.34.2
wrapt              1.11.2
zipp               2.2.0
$ pipenv run test
===== test session starts =====
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /mnt/c/Users/thy/source/repos/uml.cs, inifile: pytest.ini
plugins: cov-2.8.1
collected 41 items

Travis

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic
$ pip list
Package            Version
------------------ ----------
appdirs            1.4.3
astroid            2.3.3
atomicwrites       1.3.0    !
attrs              19.3.0
bandit             1.6.2
black              19.10b0
certifi            2019.6.16 !
Click              7.0
coverage           5.0.3
gitdb2             2.0.6
GitPython          3.0.7
importlib-metadata 1.5.0
isort              4.3.21
lazy-object-proxy  1.4.3
mccabe             0.6.1
mock               3.0.5 !
more-itertools     8.2.0
nose               1.3.7 !
numpy              1.18.0 !
packaging          20.1
pathspec           0.7.0
pbr                5.4.4
pip                19.3.1
pipenv             2018.11.26
pluggy             0.13.1
py                 1.8.1
pylint             2.4.4
pyparsing          2.4.6
pytest             5.3.5
pytest-cov         2.8.1
PyYAML             5.3
regex              2020.1.8
rope               0.16.0
setuptools         42.0.2
six                1.14.0
smmap2             2.0.5
stevedore          1.32.0
toml               0.10.0
typed-ast          1.4.1
virtualenv         16.6.1
virtualenv-clone   0.5.3
wcwidth            0.1.8
wheel              0.33.6
wrapt              1.11.2
zipp               2.2.0
python -m pytest
===== test session starts =====
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /home/travis/build/kthy/uml.cs, inifile: pytest.ini
plugins: cov-2.8.1
collected 41 items

Для более простого сравнения, вот таблица различий:

| Local (WSL)        | Travis                 |
| ------------------ | ---------------------- |
| Ubuntu 18.04.4 LTS | Ubuntu 18.04.3 LTS     |
|                    | atomicwrites-1.3.0     |
|                    | certifi-2019.6.16      |
|                    | mock-3.0.5             |
|                    | nose-1.3.7             |
|                    | numpy-1.18.0           |
| pip-20.0.2         | pip-19.3.1             |
|                    | pipenv-2018.11.26      |
| setuptools-45.1.0  | setuptools-42.0.2      |
|                    | virtualenv-16.6.1      |
|                    | virtualenv-clone-0.5.3 |
| wheel-0.34.2       | wheel-0.33.6           |

Можно увидеть полный журнал сборки от Travis, например, здесь .

1 Ответ

0 голосов
/ 14 февраля 2020

Итак, как указал Итан , проблема заключалась в моем импорте. По какой-то причине я импортировал Enum как

try:
  from features import Access
except (ImportError, ModuleNotFoundError):
  from umldotcs.features import Access

- я не могу вспомнить почему, но, вероятно, потому что у меня были некоторые проблемы с импортом раньше. Car go культовое программирование снова запускается! ? Запуск pytest локально использовал второй импорт, тогда как Travis по какой-то причине выбрал первый, вызывая Issue30545 , что является ошибкой пользователя, а не python ошибка. Убедившись, что все Enum были импортированы таким же образом, решена проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...