web-dev-qa-db-ja.com

pytestでリストの等価性をアサートするにはどうすればよいですか

pytestを使用していくつかの単体テストを作成しようとしています。

私はそのようなことをすることを考えていました:

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

最初のアサーションは問題ありませんが、2番目のアサーションでは値エラーがあります。

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

私は、pytestを使用して2つの異なるリストの同等性を主張する正しい方法ではないと思います。

データフレーム列(リスト)が期待されたものと等しいとどうやってアサートできますか?

ありがとう

18
bAN

リストを理解して、すべての値が等しいかどうかを確認できます。リスト内包結果で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
16
ritchie46

this を参照してください:

注意:

単にassertステートメントを使用して、テストの期待を表明することができます。 pytestの 高度なアサーションイントロスペクション は、アサート式の中間値をインテリジェントに報告し、 JUnitレガシーメソッド の多くの名前を学ぶ必要から解放します。

そして this

いくつかのケースで特別な比較が行われます。

  • 長い文字列の比較:コンテキストの差分が表示されます
  • 長いシーケンスの比較:最初に失敗したインデックス
  • 辞書の比較:異なるエントリ

そして レポーティングデモ

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はあなたのために大変な仕事をしました。

46
Rockallite

組み込みのunittest.TestCaseを使用している場合は、これを実行できるメソッドが既に存在します。リストの順序を気にする場合はunittest.TestCase.assertListEqual、そうでない場合はunittest.TestCase.assertCountEqualです。

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

5
Dylan Orzel

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)
1
Adam Erickson

numpy配列をpythonリストに変換すると、単にallまたはanyを使用するよりも優れた応答が得られます。このようにして、テストが失敗した場合、予想と実際の違いを見てみましょう

0
salah