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つの異なるリストの同等性を主張する正しい方法ではないと思います。
データフレーム列(リスト)が期待されたものと等しいとどうやってアサートできますか?
ありがとう
リストを理解して、すべての値が等しいかどうかを確認できます。リスト内包結果で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
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はあなたのために大変な仕事をしました。
組み込みのunittest.TestCase
を使用している場合は、これを実行できるメソッドが既に存在します。リストの順序を気にする場合はunittest.TestCase.assertListEqual
、そうでない場合はunittest.TestCase.assertCountEqual
です。
https://docs.python.org/3.5/library/unittest.html#unittest.TestCase.assertCountEqual
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)
numpy配列をpythonリストに変換すると、単にall
またはany
を使用するよりも優れた応答が得られます。このようにして、テストが失敗した場合、予想と実際の違いを見てみましょう