Hayal Etme foo
modülünde Bar
isimli bir yardımcı program (belki de bir sınıf) uyguladım ve bunun için aşağıdaki testleri yazdım.pytest: Aynı arabirimin farklı uygulamaları için yeniden kullanılabilir testler
test_foo.py:
from foo import Bar as Implementation
from pytest import mark
@mark.parametrize(<args>, <test data set 1>)
def test_one(<args>):
<do something with Implementation and args>
@mark.parametrize(<args>, <test data set 2>)
def test_two(<args>):
<do something else with Implementation and args>
<more such tests>
Şimdi ileride aynı arayüzünün farklı uygulamaları yazılması beklenen, düşünün. O uygulamaları yukarıdaki test paketi için yazılmıştır testleri yeniden muktedir istiyorum: değiştirmeniz gerekir tek şey
Implementation
<test data set 1>
ithalatı,<test data set 2>
vb
Yukarıdaki testlerin tekrar kullanılabilir bir şekilde yazılması için bir yol arıyorum; bu, arayüze yeni uygulamaların yazarların uygulama ve test verilerini bunlara enjekte ederek testleri kullanabilmesini mümkün kılar. orijinal belirtimi içeren dosyayı değiştirmek zorunda testlerin
Bunu pytest'te yapmak için iyi, deyimsel bir yol ne olurdu?
=================================
=============================================
İşte burada (güzel değil) çalışan bir sürümü.
define_tests.py:
# Single, reusable definition of tests for the interface. Authors of
# new implementations of the interface merely have to provide the test
# data, as class attributes of a class which inherits
# unittest.TestCase AND this class.
class TheTests():
def test_foo(self):
# Faking pytest.mark.parametrize by looping
for args, in_, out in self.test_foo_data:
self.assertEqual(self.Implementation(*args).foo(in_),
out)
def test_bar(self):
# Faking pytest.mark.parametrize by looping
for args, in_, out in self.test_bar_data:
self.assertEqual(self.Implementation(*args).bar(in_),
out)
v1.py:
# One implementation of the interface
class Implementation:
def __init__(self, a,b):
self.n = a+b
def foo(self, n):
return self.n + n
def bar(self, n):
return self.n - n
v1_test.py:
# Test for one implementation of the interface
from v1 import Implementation
from define_tests import TheTests
from unittest import TestCase
# Hook into testing framework by inheriting unittest.TestCase and reuse
# the tests which *each and every* implementation of the interface must
# pass, by inheritance from define_tests.TheTests
class FooTests(TestCase, TheTests):
Implementation = Implementation
test_foo_data = (((1,2), 3, 6),
((4,5), 6, 15))
test_bar_data = (((1,2), 3, 0),
((4,5), 6, 3))
Herkes (kitaplığın hatta bir istemci) başka uygulama yazma bu arabirim
- orijinal dosyalar
Test tanımlarını içeren orijinal dosyalara dokunmadan? – jacg
Donanım tanımını merkezi bir yere, daha yüksek bir düzeyde bir conftest.py dosyasına taşıyabilirsiniz. Belgeler burada: http://pytest.org/latest/fixture.html#sharing-a-fixture-across-tests-in-a-module-or-class-session dokunarak yeni yazarlar tutmak istiyor musunuz Belirli test dosyalarını veya test paketindeki herhangi bir şeyi? –
* Herhangi bir * mevcut kodu değiştirmeden eklenti eklemek mümkün olmalıdır. Birkaç uyumlu uygulama ve testlerle bir kütüphane göndersem kütüphanenin müşterileri, kütüphaneyle gelen dosyaların * herhangi birini * değiştirmeden yeni uygulamaları * ve onların testlerini * ekleyebilmelidir. Bu, önemsiz olacaktı, yeni testler yaparak yeni sınavları tekrar kullanmak istediğim için değil. Fikstürü kütüphaneyle birlikte gelen bir conftest.py'ye taşımak, (bir şeyi kaçırmadıkça), genişleticinin kütüphaneyle birlikte gelen bir dosyayı değiştirmesini gerektirecektir. – jacg