pytest更好的列表和可编辑的断言消息

pytest-iterassert的Python项目详细描述


License: MPL 2.0BuildcodecovCode style: black

皮特斯特伊特拉塞特

您是否曾经想在单元测试中使用allany,但是发现了断言 缺少信息?对集合中的类属性进行断言 让你希望你是用Java编写代码(有一个很好的断言框架)?那么 这是你的pytest助手! pytest-iterassert提供 all_match和{}给你一个好的断言。在

示例

内置的^{}^{}会导致很多 测试失败时的悲伤:

    def test_generator_without_iterassert() -> None:
>       assert all(i < 1 for i in range(3))
E       assert False
E        +  where False = all(<genexpr> at 0x10221a250>)

all_match和{}通过提升比较,使调试变得容易, 并打印有意义的调试:

^{pr2}$

举个更复杂的例子怎么样?断言类实例的属性是 很普通。在

    def test_attr_of_classes_without_iterassert() -> None:
        foos = [Foo(1), Foo(2), Foo(3)]
>       assert all(foo.bar < 3 for foo in foos)
E       assert False
E        +  where False = all(<genexpr> at 0x10597ca50>)

iterassert使将函数应用于iterable变得很容易,并将说服 pytest显示该函数的结果!在

    def test_attr_of_classes_with_iterassert_1() -> None:
        foos = [Foo(1), Foo(2), Foo(3)]
>       assert all_match(foos, get_bar) < 3
E       assert all(9001, 9002, 9003) < 3
E        +  where all(9001, 9002, 9003) = all_match([<Foo(1)>, <Foo(2)>, <Foo(3)>], get_bar)

也可以对所有项目运行更复杂的检查,方法是 在函数内部检查:

    def test_attr_of_classes_with_iterassert_2() -> None:
        foos = [Foo(1), Foo(2), Foo(3)]
>       assert all_match(foos, check_bar)
E       assert all(False, False, False)
E        +  where all(False, False, False) = all_match([<Foo(1)>, <Foo(2)>, <Foo(3)>], check_bar)

注意,在本例中,与内置函数all_match和{}非常相似 不接受运算符或操作数。在

而且,如果您需要合并更多的转换,但希望看到 中间项,capture也允许这样做:

    def test_attr_of_classes_with_iterassert_3() -> None:
        foos = [Foo(1), Foo(2), Foo(3)]
>       assert all_match(capture(foo.bar for foo in foos), check_val)
E       assert all(False, False, False)
E        +  where all(False, False, False) = all_match([9001, 9002, 9003], check_val)
E        +    where [9001, 9002, 9003] = capture(<genexpr> at 0x1031220d0>)

即使是测试总结也说明了这一切:

FAILED example.py::test_generator_without_iterassert - assert False
FAILED example.py::test_generator_with_iterassert - assert all(0, 1, 2) < 1
FAILED example.py::test_attr_of_classes_without_iterassert - assert False
FAILED example.py::test_attr_of_classes_with_iterassert_1 - assert all(9001, 9002, 9003) < 3
FAILED example.py::test_attr_of_classes_with_iterassert_2 - assert all(False, False, False)
FAILED example.py::test_attr_of_classes_with_iterassert_3 - assert all(False, False, False)

安装

pytest-iterassert is on PyPI,因此您可以简单地安装 viapip install pytest-iterassert(需要python3.6或更高版本)。在

(如果你真的很勇敢,你也可以将all_match和{}别名为 导入时的内置函数。)

变更日志

[0.0.3]-2020-05-10

  • 添加capture,并允许all_match和{}不接受 运算符/操作数,用于映射函数内部的检查

[0.0.2]-2020-05-07

  • 初次发行

发展

此库使用Poetry进行管理 依赖关系。您只需要运行poetry install,它将创建一个 安装了所有开发人员依赖项的虚拟环境。在

请在提交请求之前运行poetry run ./lint。在

许可证

此库是根据Mozilla Public License 2.0版授权的。更多 有关信息,请参阅LICENSE。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java 安卓 XMLPullParser错误   Java响应网格布局   Java中使用递归的不同方法   java变量可能尚未初始化(边加权图)   java如何将这样的文件插入MySQL数据库   java云端点:不允许实体类型的数组或集合   java(编译器或jvm)是否以不同方式处理类的静态最终成员?如果是,怎么做   java如何从lambda表达式返回新的非抽象映射?   java JDK 7支持的最大Spring版本是什么   我们如何从java类生成DTD   java在我的例子中BindingResult、FieldErrors或GlobalErrors是否可以为null?   java[LibGDX][GWT]读取文件外观时出错。HTML格式的json[序列化异常]   字典Java不可修改密钥集映射   java Admob在firebase sdk之后显示测试广告,但不显示真实广告