2011-08-10 15 views
6

ScalaTest özellikleri arasında bağımlılık olabilir mi? Bir sınama başarısız olursa, buna bağlı tüm sınamalar atlanır?TestNg dependsOnMethods ek açıklamasına benzer bir scalaTest mekanizması var

+0

One geçerli: Testler birbirlerine bağımlı olmamalıdır. (ScalaTest'te bağımlılıkların olup olmadığı konusunda hiçbir fikriniz yok) – agilesteel

+3

Bunlar yapmamalı, ancak bazen bir testin kurulumu çok pahalı olduğundan bunu gerçekten önleyemezsiniz. Diğer zamanlarda dış sistemlerde, üzerinde anlaşıldığı gibi davranmalarını sağlamak için test ediyorsunuz. Bir ilk testin test edilmesi, bir sistemin kullanılabilirliğini bozarsa, ayrıntıları test etmeye gerek yoktur. –

+6

Muhtemelen "ünite testi" nin önemli bir kuralıdır, ancak bağımlı testler, bir dizi nedenden ötürü (pahalı durumu yeniden kullanmak, doğru raporlama yapmak, alaylardan kaçınmak, vb ...) işlevsel testler için çok yararlıdır. –

cevap

0

Hazır bir çözüm hakkında bilmiyorum. Ancak kendi Armatürlerinizi oldukça kolayca yazabilirsiniz.

bakın Böyle bir fikstür örneğin ben bu özellik eklemek vermedi pending

3

çağrıları ile ilkinden sonra tüm test infaz yerini alabilir Suite trait

ait javadoc içinde "istiflenebilir fikstürü özellikleri Oluşturma" TestNG, çünkü zamanını haklı çıkarmak için hiçbir zorlayıcı kullanım vakasına sahip olmadım. O zamandan beri bazı kullanım durumları topladım ve ScalaTest'in sonraki sürümüne bir özellik ekliyorum. Ancak, bağımlı olmayan önkoşullara dayanan bir testi "iptal etme" yönteminin bir yolu olmayacaktır.

Bu arada yapabileceğiniz şey, eğer şartlar yerine getirildiyse, sadece teste kayıt yaptırmak ya da çıktıyı görmeyi tercih ederseniz bunları yoksayılacak şekilde kaydetmek için Scala kullanmanız yeterlidir. koşul testi inşaat anda kesin karşılanacak Bu yalnızca çalışacaktır

if (databaseIsAvailable) { 
    it("should do something that requires the database") { 
    // ... 
    } 
    it ("should do something else that requires the database") { 
    } 
} 

: Eğer Spec kullanıyorsanız, bunun gibi bir şey olmazdı. Örneğin, veritabanının bir BeforeAll yöntemi ile başlatılması gerekiyorsa, belki de, her bir testin içinde kontrol yapmalısınız. Ve bu durumda, beklemede olduğunu söyleyebilirdiniz. gibi bir şey:

it("should do something that requires the database") { 
    if (!databaseIsAvailable) pending 
    // ... 
} 
it("should do something else that requires the database") { 
    if (!databaseIsAvailable) pending 
    // ... 
} 
+0

Scaladocu okuduktan sonra, önkoşulları nasıl belirlediğimi hala göremiyorum. Tam olarak, bir test başarılı olduğunda bir koşulu nasıl ayarlayabilirim ki diğer süitler buna referans verebilir? – user44242

+0

Bu özellik için herhangi bir referans bulamadım, herhangi bir şans, bu uygulandı mı? –

+0

Bence Bill'in atıf yaptığı özellik “varsayım (Boolean)” dır. Varsayım başarısız olursa, bir test iptal edildi olarak gösterilir. Bu ScalaTest 2.2.1 ile. – akauppi

1

İşte herhangi bir test başarısız olursa test paketi tüm test başarısız kılan bir Scala özelliktir.
(öneri için teşekkürler, bu soruya başka bir yanıt gönderildi Jens Schauder().)

Artıları: Basit anlaşılır testi bağımlılıkları.
Eksiler: Çok özelleştirilemez.

Otomatik tarayıcı testlerim için kullanıyorum. Bir şey başarısız olursa, genellikle "karışıklık" durumunda olduğundan GUI ile etkileşime devam etmenin bir anlamı yoktur.

Lisans: Genel etki alanı (Creative Common'ın CC0), veya (sizin seçeceğiniz) MIT lisansı.

import org.scalatest.{Suite, SuiteMixin} 
import scala.util.control.NonFatal 


/** 
* If one test fails, then this traits cancels all remaining tests. 
*/ 
trait CancelAllOnFirstFailure extends SuiteMixin { 
    self: Suite => 

    private var anyFailure = false 

    abstract override def withFixture(test: NoArgTest) { 
    if (anyFailure) { 
     cancel 
    } 
    else try { 
     super.withFixture(test) 
    } 
    catch { 
     case ex: TestPendingException => 
     throw ex 
     case NonFatal(t: Throwable) => 
     anyFailure = true 
     throw t 
    } 
    } 
} 
0

İlk hatadan sonra kalan testleri iptal etmek için özellik org.scalatest.CancelAfterFailure kullanabilirsiniz: test önemli kurallardan

import org.scalatest._ 

class MySpec extends FunSuite with CancelAfterFailure { 
    test("successfull test") { 
    succeed 
    } 

    test("failed test") { 
    assert(1 == 0) 
    } 

    test("this test and all others will be cancelled") { 
    // ... 
    } 
}