LoginSignup
1
0

AssertionError: numpy array are differentが出たが設定していない数値が差分として表示された

Posted at

はじめに

PySparkを使用してデータ集計した結果をMySQLにinsertするコードの一部を改修後、テストパターンを追加して動かしたのですが、テストが通らず、原因を突き止めるのに苦戦したので備忘メモとして残します。

やりたかったこと

PySparkを使用してデータ集計した結果をMySQLにinsertするコードのテストコードを実装したい

結論

原因は時刻の不一致で、時刻がUNIXタイムスタンプで表示されていた。

動作環境

pyspark==3.3.0
numpy==1.21.3
pandas==1.3.5
PyYAML==6.0.1
PyMySQL==1.0.2

出力されたエラー

データ集計した結果をMySQLにinsertするコードの一部を改修後、テストパターンを追加して動かしたのですが、以下のようにAssertionErrorが出力されました。
以下の出力エラーとinput、expectedはサンプルです。

AssertionError: numpy array are different

numpy array values are different (33.33333 %)
[index]: [0, 1, 2]
[left]:  [1712016000000000000, 1712016000000000000, 1712016000000000000]
[right]: [1712016000000000000, 1712016000000000000, 1712019600000000000]

input.yml

- update_time: 2024-04-02 00:00:00
  id: 10000
  sub_id: 11
  flg: 1
- update_time: 2024-04-02 00:00:00
  id: 20000
  sub_id: 22
  flg: 1
- update_time: 2024-04-02 00:00:00
  id: 30000
  sub_id: 33
  flg: 0
- update_time: 2024-04-02 00:00:00
  id: 40000
  sub_id: 44
  flg: 0
- update_time: 2024-04-02 01:00:00
  id: 50000
  sub_id: 55
  flg: 1

expected.yml(flgが1のデータを返す想定)

- update_time: 2024-04-02 00:00:00
  id: 10000
  sub_id: 11
- update_time: 2024-04-02 00:00:00
  id: 20000
  sub_id: 22
- update_time: 2024-04-02 01:00:00
  id: 50000
  sub_id: 55

解決方法

AssertionErrorとは、Pythonのunittestモジュールでテストを実行する際に、assert文がFalseを返した場合に出力されるエラーです。
AssertionError自体はよく見るので、想定した実行結果と動かした結果に整合性が無いことが問題なのだなと思いました。
また、その後のindexを見るとindex[2]の値が17120160000000000001712019600000000000で一致していないことが分かりました。

通常であれば、assertionで比較した第一引数(left)と第二引数(right)の値が出力されて差分がすぐわかるのですが、今回は設定していない数値が表示されていたため、混乱しつつもid:50000の値のymlファイル双方をよく見直しました。

その結果、想定した実行結果のymlファイルの時刻が'2024-04-02 00:00:00'と'2024-04-02 01:00:00'で一致していませんでした。
時刻を修正したところ無事通りました。

日付の値の位置にある数値は何なのか

では、日付の位置にある数値が何なのかについてなのですが、この数値はUNIXタイムスタンプの値でした。
なので、変換ツールを使用してみたところ1712019600000000000 = '2024-04-02 01:00:00'であることが分かりました。

最後に

同じようにAssertionErrorで設定したはずのない数値が表示された方の参考になれば幸いです。
なぜ時刻がUNIXタイムスタンプで表示されてしまうのかという点については調査できていないので、原因が分かり次第追記したいと思います。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0