2015-04-20 8 views
7

Cihaz Altında Test'te (DUT) her türlü ölçümü gerçekleştirmek için iki enstrümanı (uzaktan kontrol edilebilir bir güç kaynağı ünitesi ve Test Altındaki Aygıtı kontrol etmek için kullanılan veri yolu denetleyicisi) yöneten bir sınıf yazıyorum.).Python Birimi İki sahte nesneyle sınama, çağrı sırasını doğrulama nasıl yapılır?

Her iki enstrümana erişim, Python sınıfları olarak uygulanır ve her birine yeni sınıf için bir referans verilir. DUT biraz hassastır ve güç kaynağına ve veri yolu denetleyicisine yapılan çağrıları içeren çok özel bir güç sıralamasına sahiptir ve DUT'a zarar vermemek için bu özel sırada gerçekleşmelidir.

Şimdi bu sınıf için bir birim testi yazmak istiyorum. Şu anda bunun için burun izleri ve sahte paket kullanıyorum. Bu yüzden benim fikrim her iki enstrüman sınıfıyla dalga geçmek ve bunlar için doğru çağrı sırasını doğrulamaktı.

Atanan her sınıfın kendisi için çağrı sırasını doğrulamak çok kolay görünüyor. Bu nedenle, güç kaynağının önce akü voltajını doğru şekilde uygulayabilmesi için, sonra dijital alan voltajı ve sonra analog alan voltajı verilip verilmediğini öğrenebiliyorum. Dijital kayıtların doğru değerlere programlandığını da öğrenebilirim. Ancak, dijital kayıt gerilimini ve analog etki alanı voltajını uygulamak arasında dijital kayıt yazma çağrısı gerçekleşip gerçekleşmediğini saptadım.

Bu yüzden sorum şu: İki alay edilmiş nesnem varsa, bu nesneler arasındaki belirli bir arama sırasını nasıl doğrulayabilirim? İlk başta, çağrıların zaman damgalarını kontrol etmekti, ancak bunlar görünmüyordu.

+0

Aşağıdakilerin sırayla doğru olup olmadığını kontrol edebilir misiniz: ne A ne B ne denir; A denir ama B değil; A ve B denir? – jonrsharpe

+1

Sanırım raporlamak istediğiniz her şeyi rapor edecek başka bir işlevi başlatmak için Mock üzerinde side_effect'i kullanabilirsiniz - yani bir şeyi genel bir listede veya uygun bir yerde saklayın – user3012759

+1

@ user3012759 Düşündüğüm aynı şey; Hatta, örneğin, B'nin çağrılmadığını iddia etmek için A'nın yan etkisini kullanmanız mümkün olabilir. – chepner

cevap

8

Yapabilecekleriniz, alaylarınızı yeni bir Mock() nesnesine koymak ve alayın yeni alayın çağrılarını kontrol etmektir.

>>> from unittest.mock import * 
>>> m0, m1 = Mock(), Mock() 
>>> m = Mock() 
>>> m.m0, m.m1 = m0, m1 
>>> m0() 
<Mock name='mock.m0()' id='140660445334224'> 
>>> m1() 
<Mock name='mock.m1()' id='140660445334608'> 
>>> m.mock_calls 
[call.m0(), call.m1()] 

Tamam şimdi iyi bir konumda bulunmaktadır: Belki bir örnek anlamak kolaydır biz ilk geçiş istediğim gibi

>>> m.assert_has_calls([call.m0(), call.m1()]) 
>>> m.assert_has_calls([call.m1(), call.m0()]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls 
    'Actual: %r' % (calls, self.mock_calls) 
AssertionError: Calls not found. 
Expected: [call.m1(), call.m0()] 
Actual: [call.m0(), call.m1()] 

: biz sadece doğru sırasını doğrulamak için m aramaları kontrol edebilirsiniz ve ters sıra başarısız.

patch'u kullandığınızda, yamalar tarafından döndürülen sahte parçaları alın ve yeni bir Mock() kapsayıcısına koyun. Çocuğun siparişlerini kaydeden konteynerinizi kontrol edin.

+0

Evet, bu mükemmel çalışıyor. Teşekkürler. Sadece ilgilenenler için, autospec alt-ataklarda da çalışır. – jan

+0

@jan Evet, alayını oluşturduktan sonra onu başka bir sahtekarın çocuğu olarak ayarla. –

+0

FYI, bu benim için işe yaramadı. Boş bir çağrı listesi almaya devam ettim. Çağrıları düzgün bir şekilde izlemek için 'attach_mock 'kullanmalıyım, şu cevabı görmeliyim: https://stackoverflow.com/a/22677452/3405140 – moertel

İlgili konular