2016-10-31 14 views
2

私はKivyアプリケーション用のユニットテストを書こうとしています。レコーダーモジュールを使用して簡単なアクションを実行し、適切なウィジェットが追加されたことを確認するのがよい方法です/ destroy(または、私はストレージモジュールを使用しているので、DictStoreが更新されています)。レコーダーモジュールでのKivyユニットテスト

録音に成功しましたが、アプリを実行して録音を再生する方法がわかりません。私はかなりのgoogle-ingを行ってきましたが、私は例を見つけることができません。これまでの記事は次のとおりです。

from my_app import MyApp 
from kivy.input.recorder import Recorder 

def recorder_loop(instance, value): 
    if value is False: 
     instance.play = True 

app = MyApp() 
app.run() 
rec = Recorder(filename='my_recorded_file.kvi') 
rec.bind(play=recorder_loop) 
rec.play = True 
app.stop() 

ここでは混乱しています。 app.run()を呼び出すと、pythonのように見えて、レコーダーコードを実行するのではなく、アプリケーションからの入力を待ちます。では、この録音をどのように再生することができますか?

答えて

2

もちろん、それは待っています。アプリケーションは、いくつかのコードを繰り返し実行する無限ループです。入力が処理されなかった場合、それと対話することさえできません。それは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を。

+0

おかげさまで、ありがとう、他の単体テストへのリンク。私は今、私のアプリのためのいくつかのテストを書くことに成功しました! –