Ipython: test_historyの失敗

作成日 2018年10月08日  ·  16コメント  ·  ソース: ipython/ipython

openSUSE用にipython7.0.1をパッケージ化しようとしていますが、単体テストで次のエラーが発生します。

======================================================================
FAIL: IPython.core.tests.test_history.test_history
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/usr/lib/python3.6/site-packages/IPython/core/tests/test_history.py", line 113, in test_history
    newhist[3]])
AssertionError: Lists differ: [(1, [51 chars]rn test'), (1, 3, "b='€Æ¾÷ß'"), (2, 1, 'z=5'), (2, 3, "k='p'")] != [(1, [51 chars]rn test'), (1, 3, "b='€Æ¾÷ß'"), (2, 3, "k='p'"), (2, 4, 'z=5')]

First differing element 3:
(2, 1, 'z=5')
(2, 3, "k='p'")

  [(1, 1, 'a=1'),
   (1, 2, 'def f():\n    test = 1\n    return test'),
   (1, 3, "b='€Æ¾÷ß'"),
-  (2, 1, 'z=5'),
-  (2, 3, "k='p'")]
?                 ^

+  (2, 3, "k='p'"),
?                 ^

+  (2, 4, 'z=5')]
-------------------- >> begin captured stdout << ---------------------
def f():
    test = 1
    return test
b='€Æ¾÷ß'
The following commands were written to file `/tmp/tmphhgt1b7l/tmpsytny8bh/test4.py`:
a=1
def f():
    test = 1
    return test
b='€Æ¾÷ß'

--------------------- >> end captured stdout << ----------------------
    """Fail immediately, with the given message."""
>>  raise self.failureException('Lists differ: [(1, [51 chars]rn test\'), (1, 3, "b=\'€Æ¾÷ß\'"), (2, 1, \'z=5\'), (2, 3, "k=\'p\'")] != [(1, [51 chars]rn test\'), (1, 3, "b=\'€Æ¾÷ß\'"), (2, 3, "k=\'p\'"), (2, 4, \'z=5\')]\n\nFirst differing element 3:\n(2, 1, \'z=5\')\n(2, 3, "k=\'p\'")\n\n  [(1, 1, \'a=1\'),\n   (1, 2, \'def f():\\n    test = 1\\n    return test\'),\n   (1, 3, "b=\'€Æ¾÷ß\'"),\n-  (2, 1, \'z=5\'),\n-  (2, 3, "k=\'p\'")]\n?                 ^\n\n+  (2, 3, "k=\'p\'"),\n?                 ^\n\n+  (2, 4, \'z=5\')]')


----------------------------------------------------------------------

最後の2つのリスト要素の場所が入れ替わったように見えますが、なぜそうなるのかわかりません。


編集:

この問題は、次の2つの手順で修正できる可能性があります。

1)影響を受けていると思われるsqliteバージョンの範囲について、テストをスキップ(または既知の失敗)としてマークします。
2)これが修正する価値のある動作の変更であるかどうか、またはそれに応じてテストを更新する必要があるかどうかを実際に把握します。

Hacktoberfest help wanted

最も参考になるコメント

IPythonコードベースにはアンダースコアがないと思います。

たとえば、そこに

@dsblank RipGrepを試しましたか? 本当に良い:デフォルトで.gitをスキップし、デフォルトで再帰的に検索し、色を強調表示し、ファイルタイプでフィルタリングします。 Pythonファイルでのみskipifを検索する例:

$ rg <strong i="11">@skipif</strong> -tpy
IPython/extensions/tests/test_autoreload.py
133:    @skipif(sys.version_info < (3, 6))

IPython/core/tests/test_interactiveshell.py
531:    @skipif(not hasattr(signal, 'SIGALRM'))

IPython/lib/tests/test_latextools.py
47:<strong i="12">@skipif_not_matplotlib</strong>
62:<strong i="13">@skipif_not_matplotlib</strong>

IPython/lib/tests/test_display.py
182:<strong i="14">@skipif_not_numpy</strong>
 ~/dev/ipython[master ✗] $ rg <strong i="15">@skip_if</strong> -tpy
IPython/lib/tests/test_clipboard.py
7:<strong i="16">@skip_if_no_x11</strong>

IPython/utils/tests/test_path.py
102:<strong i="17">@skip_if_not_win32</strong>
117:<strong i="18">@skip_if_not_win32</strong>
157:<strong i="19">@skip_if_not_win32</strong>
377:    <strong i="20">@skip_if_not_win32</strong>
468:    <strong i="21">@skip_if_not_win32</strong>

...そして私のマシンでは10倍高速です。

全てのコメント16件

どのバージョンのPythonでそれを実行していますか? sqliteのバージョンも見てください。

Pythonとsqliteのバージョンは次のとおりです。

libsqlite3-0-3.25.0-1.1
python3-3.6.5-3.4

そして、私が推測する他のいくつかは関連しているかもしれません:

bash-4.4-107.1
coreutils-8.30-1.2
gcc8-8.2.1+r264010-1.1
gettext-runtime-mini-0.19.8.1-9.1
gettext-tools-mini-0.19.8.1-9.1
glibc-2.27-6.1
libdb-4_8-4.8.30-36.5
libgdbm5-1.14.1-1.6
libgdbm_compat4-1.14.1-1.6
libncurses6-6.1-6.5
libreadline7-7.0-2.1
libstdc++6-8.2.1+r264010-1.1
libzmq5-4.2.5-2.1
linux-glibc-devel-4.18-1.1
ncurses-utils-6.1-6.5
python3-ipython_genutils-0.2.0-2.1
python3-jedi-0.12.1-1.1
python3-jsonschema-2.6.0-2.2
python3-jupyter_client-5.2.3-4.1
python3-jupyter_core-4.4.0-3.1
python3-jupyter_ipyparallel-6.2.2-6.27
python3-jupyter_ipywidgets-7.4.2-10.1
python3-jupyter_nbconvert-5.4.0-15.11
python3-jupyter_nbformat-4.4.0-3.1
python3-jupyter_notebook-5.7.0-8.3
python3-jupyter_qtconsole-4.4.1-5.2
python3-jupyter_widgetsnbextension-3.4
python3-nose-1.3.7-10.1
python3-pexpect-4.6.0-2.1
python3-pyparsing-2.2.0-2.1
python3-pyzmq-17.1.2-1.1
python3-setuptools-40.4.3-1.1
python3-simplegeneric-0.8.1-8.4
python3-simplejson-3.16.1-1.1
python3-six-1.11.0-4.1
python3-terminado-0.8.1-3.1
python3-testpath-0.4.1-4.1
python3-traitlets-4.3.2-4.1
python3-wcwidth-0.1.7-2.1

この問題はバージョン6.5でも発生しているようです。 sqlite33.24.0から3.25.0に切り替えたときに最初に問題が発生したようです。

実際にはz=5の場合、タプルの2番目の数値が変更されています。 それはline number (AFAICT)です。

では、なぜ1ではなく4 ...? uniqueをリクエストすると、3番目の列でuniqのみをリクエストし、sqliteはソートする前に内部動作を変更して一意化することで、 z=5の2番目の反復を返す可能性があります。

私は逃しました。 しかし、私はSQLについて何も知らないので、なぜそれが起こっているのかわかりません。 最新バージョンのsqlite3.25.2でも問題が発生することを確認しました。

私もSQLの専門家ではありません。テストの失敗は、SQLの専門家ではないと言えます。
クリティカル。 「既知の失敗」マーカーは、openSUSE用にパッケージ化するのに役立ちますか?
根本的な原因を見つけたいですか?

日、2018年10月14日には、12時28分トッドの[email protected]書きました:

私は逃しました。 しかし、SQLについては何も知らないので、わかりません。
なぜそれが起こっているのか。 問題がまだ発生していることを確認しました
sqlite 3.25.2、最新バージョン。


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ipython/ipython/issues/11372#issuecomment-429654816
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AAUez9oGI6J02rTiDIfuzUCrpY71axO9ks5uk5B1gaJpZM4XMOVJ

バグがどれほど深刻かわからないので、あなたの判断に任せます。 もちろん、実際の修正が望ましいですが、問題が十分に小さいと思われる場合は、当面は既知の失敗で対処できます。

@LucianaMarques簡単なものを探していましたが、次のような条件で「@skip_if」を追加するのはそれほど難しいことではありません... sqlite3.sqlite_version_info > (x, y, z)

後で修正するのを遅らせることができます。

@Carreauありがとうございます、今日はやってみます!

@Carreauは、私は(...または私はきちんとそれを探していないよ)私はそれを使用していないし、その上に何のドキュメントを発見したことがない、@skip_if使用に問題を抱えています、あなたはどんなチュートリアル/ドキュメントの勧告がありますか?

@LucianaMarques新しい領域でコーディングを開始するときはいつでも、現在のコードで例を見つけようとします。 Unixベースのシステムを使用している場合は、 grepを使用してコードベースで「skip_if」の例を検索し、類推して現在の問題に適用できます。

IPythonコードベースにはアンダースコアがないと思います。

たとえば、そこに

@dsblank RipGrepを試しましたか? 本当に良い:デフォルトで.gitをスキップし、デフォルトで再帰的に検索し、色を強調表示し、ファイルタイプでフィルタリングします。 Pythonファイルでのみskipifを検索する例:

$ rg <strong i="11">@skipif</strong> -tpy
IPython/extensions/tests/test_autoreload.py
133:    @skipif(sys.version_info < (3, 6))

IPython/core/tests/test_interactiveshell.py
531:    @skipif(not hasattr(signal, 'SIGALRM'))

IPython/lib/tests/test_latextools.py
47:<strong i="12">@skipif_not_matplotlib</strong>
62:<strong i="13">@skipif_not_matplotlib</strong>

IPython/lib/tests/test_display.py
182:<strong i="14">@skipif_not_numpy</strong>
 ~/dev/ipython[master ✗] $ rg <strong i="15">@skip_if</strong> -tpy
IPython/lib/tests/test_clipboard.py
7:<strong i="16">@skip_if_no_x11</strong>

IPython/utils/tests/test_path.py
102:<strong i="17">@skip_if_not_win32</strong>
117:<strong i="18">@skip_if_not_win32</strong>
157:<strong i="19">@skip_if_not_win32</strong>
377:    <strong i="20">@skip_if_not_win32</strong>
468:    <strong i="21">@skip_if_not_win32</strong>

...そして私のマシンでは10倍高速です。

@Carreau@dsblankに感謝します。あなたの提案は本当に役に立ちました。以前はこのコマンドに精通していなかったと思います。

すぐにプルリクエストで戻ってきます。

約束通り、私のプルリクエスト

Skip_ifが追加されたので、これを開いたままにして、問題の根本に移動します。

ありがとう!

将来の参照とおそらく実際の修正のために、これは、ipythonがSQLの「GROUPBY」句を使用して重複を押しつぶし、列のグループ化でも集計関数(セッションと行)でもない列による選択と順序付けを行うために発生しているようです。 SQLもsqliteも、結果として得られる各グループのどの行から、いわゆる「裸の」列の値を引き出すかを指定していません。その点で、sqliteの実際の動作は明らかに変化しています。

生成されたSQLでいくつかのバリエーションを試しましたが、sqlite33.26.0に対しては成功しませんでした。 それを行う方法は確かにありますが、必要な変更のサイズと検索パフォーマンスへの影響については疑問があります。

このページは役に立ちましたか?
0 / 5 - 0 評価