0

基本的に、pySnmp ライブラリを使用して SNMP メッセージを送信する複雑さを隠す関数を作成しました。次のようになります。

snmpWalk(host,oid):
    from pysnmp.entity.rfc3413.oneliner import cmdgen
    cg = cmdgen.CommandGenerator()
    comm_data = cmdgen.CommunityData('my-manager','public')
    transport = cmdgen.UdpTransportTarget((host,161))
    variables = oid
    return cg.nextCmd(comm_data,transport,variables)

私は単体テストが初めてで、minimock を使用してこのコードの単体テストを doctest として記述しようとしていましたが、これが私が思いついたものです:

#Setup the mocks
>>> from minimock import mock, Mock
>>> cmdgen.CommandGenerator = Mock('cmdgen.CommandGenerator')
>>> cmdgen.CommunityData = Mock('cmdgen.CommunityData')
>>> cmdgen.UdpTransportTarget = Mock('cmdgen.UdpTransportTarget')
>>> cgMock = Mock('cgMock')
>>> cmdgen.CommandGenerator.mock_returns = cgMock
>>> cmdgen.CommunityData.mock_returns = 1
>>> cmdgen.UdpTransportTarget.mock_returns = 2
>>> cgMock.nextCmd.mock_returns = (1,2,3,4)
#run the test
>>> PrinterMonitor.SnmpWalk('192.0.0.1','1.1.1.1.1.1.1') 
Called cmdgen.CommandGenerator()
Called cmdgen.CommunityData('my-manager', 'public')
Called cmdgen.UdpTransportTarget(('192.0.0.1', 161))
Called cgMock.nextCmd(1, 2, (1, 1, 1, 1, 1, 1, 1))
(1, 2, 3, 4)

だから私はこのテストを実行し、それはうまくいきますが、私の質問は、サードパーティのライブラリのあらゆる側面をモックするために本当にこのすべての努力をする必要があるのですか? cg.nextCmd(comm_data,transport,variables)私の考えでは、単体テストでプリンターへのメッセージの送信を実際に開始したくないため、モックする必要がある最小限は最終行ですが、ライブラリコードへの他の呼び出しでは、何に応じて一貫した結果が得られるはずです私は彼らに渡します。コードがライブラリと適切に対話することを確認できます (つまり、モックcg.nextCmd(...)呼び出しに渡されたオブジェクトでこれをアサートすることにより、ホスト引数がトランスポート変数に正しく渡されることを確認しますか?

4

1 に答える 1

0

それだけの努力をする必要がありますか?いいえ。

関数を使用するコードをテストするsnmpWalk()には、関数を含むクラスをモックアウトすることをお勧めします。Python の用語はわかりませんが、Java の用語でsnmpWalk()は、インターフェイスを配置してから、pySnmp の実装と任意の数のモック/テストの実装を行います。コード呼び出しsnmpWalk()は内部の詳細を気にする必要はなく、戻り値だけを気にする必要があるため、モックしたいレベルです。

pySnmp 実装クラス自体をテストするために、ライブラリ呼び出しをモック アウトすることもできますが、モックがライブラリを非常に厳密にエミュレートする必要があることを考えると、それは多くの作業とリスクを伴います。私は本当の電話に固執します。それが実際のプリンター要求を発生させることを意味する場合は、そのテストを頻繁に実行しないでください。または、仮想/偽のプリンターに印刷するようにライブラリを構成する方法があるかどうかを確認してください。

于 2012-01-24T18:24:34.267 に答える