如何使用pytest

时间:2017-10-24 15:18:14

标签: python unit-testing pytest

我尝试使用 pytest 进行一些单元测试。

我正在考虑做这样的事情:

actual = b_manager.get_b(complete_set)
assert actual is not None
assert actual.columns == ['bl', 'direction', 'day']

ok中的第一个断言但是第二个断言我有一个值错误。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我认为这不是用pytest断言两个不同列表相等的正确方法。

如何判断数据帧列(列表)是否等于预期的列?

由于

7 个答案:

答案 0 :(得分:24)

请参阅this

  

注意:

     

您可以简单地使用assert语句来断言测试   期望。 pytest的Advanced assertion introspection会   智能地报告断言表达式的中间值   让您无需学习JUnit legacy methods的许多名称。

this

  

针对许多案例进行了特殊比较:

     
      
  • 比较长字符串:显示上下文差异
  •   
  • 比较长序列:第一个失败的指数
  •   
  • 比较dicts:不同的条目
  •   

reporting demo

failure_demo.py:59: AssertionError
_______ TestSpecialisedExplanations.test_eq_list ________

self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>

    def test_eq_list(self):
>       assert [0, 1, 2] == [0, 1, 3]
E       assert [0, 1, 2] == [0, 1, 3]
E         At index 2 diff: 2 != 3
E         Use -v to get the full diff

在那边看到列表与文字==相等的断言? pytest为你做了很多努力。

答案 1 :(得分:8)

您可以执行列表推导以检查所有值的相等性。如果您在列表推导结果上调用all,则如果所有参数相等,则会返回True

actual = ['bl', 'direction', 'day']

assert all([a == b for a, b in zip(actual, ['bl', 'direction', 'day'])])

print(all([a == b for a, b in zip(actual, ['bl', 'direction', 'day'])]))

>>> True

答案 2 :(得分:7)

在编写断言之前,请回答以下问题:

  1. 订单重要吗?
  2. 可以重复吗?
  3. 可以有不可散列的元素吗?

No,No,No:集合中的对称差异

a = [1, 2, 3]
b = [3, 2, 1]
diff = set(a) ^ set(b)
assert not diff

在大型列表上使用此方法很方便,因为diff仅包含它们之间的差异,因此AssertionError将紧凑且 可读。

注意set()将删除重复项。最好也检查一下:

assert len(a) == len(set(a))

否,是,是:比较排序列表

a = [1, {'a': 1}, 2, 3]
b = [3, 2, 1, {'a': 1}]
assert sorted(a) == sorted(b)

是,是,是:比较列表

a = [1, 2, 3, {'a': 1}]
b = [1, 2, 3, {'a': 1}]
assert a == b

答案 3 :(得分:5)

如果您使用的是内置unittest.TestCase,则已有一种方法可以为您执行此操作:unittest.TestCase.assertListEqual如果您关心列表排序,unittest.TestCase.assertCountEqual如果您不喜欢“T。

https://docs.python.org/3.5/library/unittest.html#unittest.TestCase.assertCountEqual

答案 4 :(得分:1)

使用numpy函数array_equal

import numpy as np

test_arrays_equal():
    a = np.array([[1, 3], [2, 3], [1, 4], [2, 4], [1, 5], [2, 5]])
    b = np.array([[1, 3], [2, 3], [1, 4], [2, 4], [1, 5], [2, 5]])
    assert np.array_equal(a, b)

答案 5 :(得分:0)

将numpy数组转换为python列表,与仅使用allany相比,您将获得更好的响应。这样,如果测试失败,您将看到预期与实际的差异

答案 6 :(得分:0)

您还可以使用https://github.com/AdityaSavara/UnitTesterSG,可以通过pip UnitTesterSG获得