もちろん、それは待っています。アプリケーションは、いくつかのコードを繰り返し実行する無限ループです。入力が処理されなかった場合、それと対話することさえできません。それはwhile True: pass
のように想像してください。
しかし、アプリケーションは少し違っていて、無限ループを「一時停止」することができれば、外部からやりとりすることができます。
Recorder
はかなり良いモジュールですが、それは、でも、それを使用して、したがって、アクション間の時間を編集した後、本当に良い理由を持っている必要がテストのためsuperslowだそう、それだけでテストしながら、貴重なリソースと時間を、無駄です。
Kivyでunittestingについて私の"article"を読むと、複数のテスト(鼻のようなものですが、簡単な方法)を実行するパッケージさえあります。私は実際にそのレポを削除するために滑走ないんだけど、場合に何かが起こった:
import unittest
import os
import sys
import time
import os.path as op
from functools import partial
from kivy.clock import Clock
main_path = op.dirname(op.dirname(op.abspath(__file__)))
sys.path.append(main_path)
from main import My
class Test(unittest.TestCase):
# sleep function that catches `dt` from Clock
def pause(*args):
time.sleep(0.000001)
# main test function
def run_test(self, app, *args):
Clock.schedule_interval(self.pause, 0.000001)
# Do something
app.my_button.dispatch('on_release')
self.assertEqual('Hello Test', app.my_button.text)
#self.assertEqual('Fail Test', app.my_button.text)
# Comment out if you are editing the test, it'll leave the
# Window opened.
app.stop()
# same named function as the filename(!)
def test_example(self):
app = My()
p = partial(self.run_test, app)
Clock.schedule_once(p, 0.000001)
app.run()
if __name__ == '__main__':
unittest.main()
方法「一時停止」の間隔で内側からアプリケーションの無限ループを一時停止し、あなたはそれで非常に簡単対話することができます。
あまり気分が悪い部分に入ってみましょう。テストするときには、おそらくいくつかのウィジェットなどにナビゲートする必要がありますが、この方法を使用してAppクラスにすべてを簡単にアクセスできるようにすることが必要な場合があります。そうしないと、名前が本当にすぐになくなり、メインコードをもっと混乱させるでしょう。
something.ids.<id>.children[1].ids. ...
は見た目が良くありませんが、ツリーの調査の深さ、どこにいるのか、そしてテストの開始時に変数に置くことができるので、便利です。テストを行うときは、ファイルkv
を見ると便利です。それは、移動する子ツリーを簡単に書くことができます。
気軽にmy testsを確認してください。
アップデート:最近、私は間違いなくids
を通じてより良いオブジェクトのアクセスに役立ちますティトから何か新しいっぽい、見てきました - Teleniumを。
おかげさまで、ありがとう、他の単体テストへのリンク。私は今、私のアプリのためのいくつかのテストを書くことに成功しました! –