Python ile BDD uygulaması [kapalı]


133

Davranış Odaklı Gelişim uygulamak için python için mevcut en gelişmiş çerçeveler ve araçlar hangileridir? Özellikle yakut için rspec ve mocha gibi benzer araçlar bulmak harika olurdu.


1
Flowp "minimum sihirle RSpec BDD tarzında testler yazmanıza izin verir".
Carl G

7
Sadece SO üzerinde son derece bilgilendirici olmak eşit "yapıcı değil".
jeremyjjbrown

Yanıtlar:


38

Ian Bicking doctest kullanmanızı önerir davranış odaklı tasarım için :

Ben şahsen davranış odaklı bir tasarım tarzında burun ve boşluk taklidi kullanma eğilimindeyim . Özellikle, burun için spec eklentisi BDD için mükemmeldir.


7
Andrew Bennetts kısa süre önce doctest'in neden istismar edildiğini düşündüğü hakkında birkaç yazı yazdı. andrew.puzzling.org/diary/2008/October/23/narrative-tests andrew.puzzling.org/diary/2008/October/24/more-doctest-problems
ddaa

4
Sanırım doctest, BDD'nin felsefesi ile amaçlandığı gibi ele aldığınızda daha uyumludur: yazılım hakkında yazmaya başlarsınız ve daha sonra bunu testler oluşturan örneklerle kesişirsiniz. "Belgeye dayalı geliştirme" olarak da tanımlanmıştır - asıl mesele, iç iş birimlerine değil dışa açık işlevselliğe odaklanmaktır. Bence xUnit geleneği bunu yapmakta korkunç.
ianb

48

Marul, python için salatalık benzeri bir araç anlamına gelir: http://lettuce.it/

Kaynağı github.com/gabrielfalcao/lettuce adresinden alabilirsiniz.


marul düşünen Windows kullanıcıları, yazarken, bu işletim sisteminin desteğinin basit olmadığını bilmelidir.
leonigmig

7
Marul'u django ile kullanmak isteyen kullanıcılar, varsayılan olarak test için varsayılan veritabanınızı kullandığını bilmelidir . Bu ilginç tasarım seçimi bana bir üretim veri tabanına mal oldu :(
Rachel

3
Behave gibi Marul'a da bazı alternatifler var; İşte onları karşılaştıran ve Behave'i savunan bir blog yazısı .
driftcatcher

1
Teşekkürler @seafangs - Behave, büyük projeler için Marul'dan çok daha yönetilebilir görünüyor.
jamesc

Django kullanıyorsanız, Marul kullanarak biraz zaman kazanın, mevcut sürüm 2.19 en son django ile çalışmaz.
James Lin

46

Gerçekten davranmayı tavsiye ederim .

Python için bir salatalık klonu arıyorum, marul kullanmaya başladım, ancak oldukça beceriksizce tasarlanmış bir kopya buldum. Çok Unpythonic.

Sonra davrandığımı keşfettim ve çok mutlu oldum.


11
Bir django projesinde test etmek için varsayılan veritabanını kullanma varsayılan davranışı bana canlı bir sunucuda bir üretim veritabanına mal olduğunda maruldan davranmaya geçtim :( Gerçekten davranmayı severim; django'nun
Rachel

1
Acınızı hissediyorum, ayrıca ıstıraplarınızın django ekosisteminin gelişmesine katkıda bulunduğunu görmekten memnunum. ;-)
John Wang

1
Özellik dosyaları olmadan davranabilir miyim? Teknik olmayan kullanıcılara sahip değilim, bu yüzden onları yazmak benim için sadece gürültü. Birisi benim verilen / ne zaman / sonra testleri okuyamıyorsa orada hiçbir iş var.
jeremyjjbrown

29

BDD ve TDD uygulamalarında programcılara yardımcı olmak için geliştirilmiş bir dizi araç kullanmanızı öneririm. Bu araç seti aşağıdakilerden oluşur: pycukes , specloud , ludibrio ve should-dsl .

Should-DSL size RSpec benzeri beklentiler verecektir. RSpec beklenti API'si ile yapabileceğiniz her şey, dsl de yapmalıdır. En son sürümü Github'dan alabilirsin .

SpecLoud , BDD benzeri birim testleri çalıştırmanıza yardımcı olur. Yaparak kurabilirsiniz

pip install specloud

Ludibrio , test çiftleri için bir kütüphanedir ( Alaylar , Saplamalar ve Aptallar). Yoluyla yükleyin

pip install ludibrio

Ve PyCukes BDD için ana araçtır. Senaryoları, vs. çalıştıracak. Yine,

pip install pycukes

Daha fazla bilgi için lütfen PyPi'deki araç belgelerini okuyun .


Cevabınızın ayrıntılarını ararken bu yararlı belgeyi buldu: arxiv.org/pdf/1007.1722
amit

Gerekir-dsl seviyorum. Python BDD için bir DSL düşünüyordum - birkaç tane var, bu oldukça etkileyici görünüyor.
Danny Staple

Pyramid adlı bir BDD çerçevesi hakkında herhangi bir bilgi bulamıyorum. Test ve puan googling ilgisi olmayan bir şüpheli görünümlü sitesine @phaedrus iletkenleri ile bağlantılı kağıt başvurulan bağlantı Piramit , web çerçeve. Herkes güncel bir bağlantı sağlayabilir mi?
Björn Pollex

1
Kesin iddia DSL'yi tercih ederim .
fatuhoku

@ BjörnPollex, Piramit adı, Piramit Web Çerçevesi nedeniyle bu araç yaratıcıları tarafından kullanılamadı. Şimdi onlar sadece ayrılmış aletler.
Douglas Camata

11

Harika gönderi ve cevaplar. Sadece dahil etmek güncelleme istedi tazelemek ben kesilir pycukes okurken bu listede. Freshen ile BDD ve Django kullanma hakkında iyi bir yazı burada .


9

Etkileyici iddialar için "emin" kullanabilirsiniz (tıpkı RSpec'de olduğu gibi)


Parabenler! Magic.py'deki kodla tamamen aklıma başladın. Python'da "uzatma yöntemleri" nin (açık sınıflar) mümkün olduğu hakkında hiçbir fikrim yoktu.
mdwhatcott

8

Pyccuracy projesi Python'da BDD için alana özgü bir dil sağlama çabasıdır.

API düzeyinde çalışan doctest'in aksine, web sayfası yükleme ve form gönderme gibi üst düzey işlemleri kodlar. Kullanmadım ama aradığınız şey bu ise biraz umut verici görünüyor.


6

Pyccuracy'i çok seviyorum . Bugünlerde orta büyüklükte bir projeye uyguluyorum.


3
Herkesin paylaşabileceği herhangi bir yeni Pyccuracy vs Marul karşılaştırması ile ilgilenirim.
michela

Karşılaştırmaya da Freshen'i ekleyin (yukarıdaki cevapta bağlantılı).
amit

Zaten burada sorulmuştur: quora.com/…
amit

6

Pyspec'leri deneyin . Testleri okumayı kolaylaştırmak ve geliştirme sırasında sürekli çalıştırmak, bu projeyi oluşturmamdaki temel hedeflerimdendi.

Test Kodu:

from pyspecs import given, when, then, and_, the, this

with given.two_operands:
    a = 2
    b = 3

    with when.supplied_to_the_add_function:
        total = a + b

        with then.the_total_should_be_mathmatically_correct:
            the(total).should.equal(5)

        with and_.the_total_should_be_greater_than_either_operand:
            the(total).should.be_greater_than(a)
            the(total).should.be_greater_than(b)

    with when.supplied_to_the_subtract_function:
        difference = b - a

        with then.the_difference_should_be_mathmatically_correct:
            the(difference).should.equal(1)

Konsol Çıkışı:

# run_pyspecs.py

  |  given two operands 
  |    when supplied to the add function 
  |      then the total should be mathmatically correct 
  |      and the total should be greater than either operand 
  |    when supplied to the subtract function 
  |      then the difference should be mathmatically correct 

(ok) 6 passed (6 steps, 1 scenarios in 0.0002 seconds)

4

Muhtemelen bu noktayı tamamen özlüyorum, ancak orijinal BDD kağıdında tuttuğum şey, BDD'nin sadece TDD olmasıydı en iyi uygulamaları vurgulamak için yeniden paketlenmiş .

Yorumum doğruysa, sadece herhangi bir xUnit uygulamasında yöntemleri yeniden adlandırarak bir BDD çerçevesi alabilirsiniz . Öyleyse devam edin ve standart kütüphanenin unittest'ini kullanın .

EDIT: Hızlı bir google peynir dükkanında bir davranış modülü döndü . BDD'yi daha fazla aramak başka bir şey bulamadı.


TDD gerçekten BDD'den tamamen farklı bir ölçekte devrim yaratan bir uygulamadır. Yine de BDD tarzında test odaklı yazmanın yolunu takdir ettim.
JtR

1
BDD birim seviyesinde başladı, bu doğru. Bağlamların, olayların ve sonuçların biraz daha yeniden kullanılabilirlikten faydalandığı sistem düzeyinde davranışı kapsayacak şekilde hızlı bir şekilde büyüdü - bu nedenle hem bunu hem de teknik olmayan paydaşlarla yapılan görüşmelerden yakalanan doğal dil senaryolarını destekleyen araçların çoğalması. Bu soru sorulduğundan beri, BDD'yi Konuşma ve etki alanı dili yoluyla keşfe vurgu yapan Feature Injection'ı kullanarak proje vizyon seviyesine yükselttik. Güneşin altında hala yeni bir şey yok.
Lunivore

Bdd youtube.com/watch?v=pherUEzdJow hakkında bu konuşmayı beğendim . Spesifikasyonlar yazmak ve test etmek için iyi bir yol gösteririm.
aisbaa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.