2016-12-17 8 views
3

Ubuntuリモートサーバーでスケジュールライブラリを使用して、3日ごとにイベントをトリガするとしましょう。どのように私は自分のクロック速度を上げるか、このコードをテストすることができテストスケジュールライブラリpython - 時間とイベント

import schedule 
import time 

def job(): 
    print("I'm working...") 

schedule.every(3).days.at("10:30").do(job) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 

コードは次のようになりますか?

答えて

2

クロックをフェイクアウトする代わりに、このコードを別の方法でテストできます。

明らかに、job()関数の単体テストを書くことができます(つまり、それが正常に動作していることを確認してください)。これはおそらくあなたにとっては明らかです。あなたはおそらく、メインスクリプトがあなたの関数を適切に呼び出すかどうかをテストすることができますが、あなたがテストを実行するときにはそれを10:30とすることはできません。

有名な「猿のパッチ」を入力してください。 Pythonにはファーストクラスの関数があるので、関数に名前を単にバインドすることができます。私はユニットテストフレームワークに取得するつもりはないし、どのようにmockライブラリを使用するが、ここであなたが探しているかもしれないものの簡単な例です:

import schedule 
import time 

def mock_run_pending(): 
    job() 

def mock_time_sleep(num): 
    exit() 

schedule.run_pending = mock_run_pending 
time.sleep = mock_time_sleep 

def job(): 
    print("I'm working...") 

schedule.every(3).days.at("10:30").do(job) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 

だから何がここで起こっているのは?コードスニペットを実行すると、実際にjob関数が呼び出されます。それはちょうど1回呼ばれ、プログラムは終了します。その理由は、timescheduleモジュールの関数の名前を "模擬"バージョンに再バインドするだけです(テスト可能にするためです)。

編集:私たちもスゴ行くと私たちはスケジューラに適切な引数に渡してテストすることができます(私は自分自身を助けることができなかった):

import schedule 
import time 

class MockEvery(object): 
    def __init__(self, num): 
     assert(num == 3) 
     self.days = MockDays() 

class MockDays(object): 
    def __init__(self): 
     pass 

    def at(self, time): 
     assert(time == "10:30") 
     return MockAt() 

class MockAt(object): 
    def __init__(self): 
     pass 

    def do(self, func): 
     assert(func == job) 

def mock_every(num): 
    return MockEvery(num) 

def mock_run_pending(): 
    job() 

def mock_time_sleep(num): 
    exit() 

schedule.run_pending = mock_run_pending 
time.sleep = mock_time_sleep 
schedule.every = mock_every 

def job(): 
    print("I'm working...") 

schedule.every(3).days.at("10:30").do(job) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 

P.S. (これはあなたの質問には関係ありませんが、役に立つかもしれません):これをテストフレームワークに組み込む場合は、mockパッケージ、特に@patchデコレータをチェックしてください。これは単体テスト(またはそれに関する任意の関数)内のサルパッチ関数にすることを可能にします。他のテストがある場合はexit()に電話することも望ましくありません。 pytestで特定のテストを終了するのは簡単ですが、組み込みのunittestで行うのは少し難しくなりますが、確かに可能です。しかし、私は逃げる。

HTH。

関連する問題