Karmaşık düzenli ifadeler için birim testleri yapılmalı mı?


34

Uygulamamda karmaşık normal ifadeler için birim testleri yazmalı mıyım?

  • Bir yandan: giriş ve çıkış formatları genellikle basit ve iyi tanımlanmış olduklarından ve genellikle çok karmaşık hale gelebildiklerinden testler kolaydır, bu nedenle bunların testleri özellikle değerlidir.
  • Öte yandan: Kendileri nadiren bazı birimlerin arayüzünün bir parçasıdır. Arabirimi yalnızca sınamak ve bunu regex'leri dolaylı olarak sınamak üzere yapmak daha iyi olabilir.

DÜZENLE:

Bu yorumunda , iç bileşenlerin ünite testi için özel bir durum olduğunu not eden Doc Brown ile aynı fikirdeyim .

Ancak iç bileşenler regex'lerin birkaç özel özelliği olduğundan:

  1. Tek bir satır regex gerçekten ayrı bir modül olmadan gerçekten karmaşık olabilir.
  2. Regexes, herhangi bir yan etkisi olmadan çıktının çıktısını alacağı için harita çizer ve böylece ayrı ayrı test etmek kolaydır.

12
“Onlar kendileri nadiren bir birimin arayüzünün bir parçası.” - Sınıflarınızda arayüzün altında gömülü ilginç bir kod varsa, sınıflarınızı ayırın. Bu, tess'i düşünmenin tasarımı nasıl geliştirebileceğine bir örnektir.
Nathan Cooper

3
Aynı soru daha genel bir şekilde: hangi iç bileşenler birim test edilmeli? Bkz programmers.stackexchange.com/questions/16732/...
Doktor Brown'a

Sorta ile ilgili, Regex101'e bakınız. Bunlar regex'iniz için birim sınamaları yazmak için bir bölümleri var. Örneğin: regex101.com/r/tR3mJ2/2
David,

3
Yasal Uyarı - Bu yorumu Naçizane fikrim: 1 - ayrıca bkz Karmaşık regexpleri saf kötülük olduğuna inanıyoruz her şeyden önce blog.codinghorror.com/... 2 tür ifadeler test gerçek değerini geliyor Sen gerçek büyük veritabanı üzerinde test ederken data blog.codinghorror.com/testing-with-the-force 3 Bu testlerin tam olarak ünite testi olmadığı konusunda garip hissediyorum
Boris Treukhov

Yanıtlar:


101

Dogmatizmi bir kenara test ederken, asıl soru, birim test karmaşık düzenli ifadelerine değer sağlayıp sağlamadığıdır. Eğer regex yeterince karmaşıksa, regex'in genel bir arayüzün parçası olup olmadığına bakılmaksızın değer sağladığı oldukça açıktır, çünkü hataları bulmanızı ve çoğaltmanızı ve gerilemeye karşı önlemenizi sağlar.


25
1, normal ifade bu bir mesele olduğunu karmaşık yeterli ise, o zaman muhtemelen (uygun yöntemlerle bir "sarıcı" birimine taşımak için mantıklı olsa isValid, parse, tryParseKullanıldığı ediliyor tam olarak nasıl bağlı veya etajer), bu yüzden İstemci kodunun şu anda bir regex kullanılarak uygulandığını bilmesi gerekmediğini Paketleme ünitesi daha sonra ayrıntılı testleri yapacaktır - ki bu da mevcut uygulamayı bilmek zorunda kalmayacaktır. Bu testler, elbette, regex'in fiili olarak test edilmesidir, ancak uygulama-agnostik bir şekilde.
ruakh

1
Bir ex ex, özel ve çok özlü bir dilde olsa da, bir programdır. Bu nedenle, test önemsiz ifadeler için uygundur ... Ve kesinlikle ifadeyi çağıran kod test edilmeli, bu da saklı bir şekilde test edebilir.
keshlam

6
@ruakh Peki dedi. Bir regex için bir sarmalayıcı sınıfının yararı, gerekirse, normal bir kodla düzgün şekilde değiştirebilmenizdir. Karmaşık giriş / çıkış kodunun her zaman birim testine sahip olması gerekir, çünkü olmadan hata ayıklamak oldukça zordur. Kodun etkilerini anlamak için belgelere başvurmanız gerekirse, birim testleri yaptırmalıdır. Tür dönüştürme gibi yalnızca 1: 1 eşleme işlemi yapıyorsa, sorun olmaz. Regex'ler, dokümanlar isteme noktasını çok çabuk geçiyor.
Aaron3468

4
@ Lii: Regexes herhangi bir özel tedaviyi haketmez. Regex bu durumda ünitedir, bu yüzden ünite testi yapıyoruz.
JacquesB

1
@ruakh Bu etki için bir cevap yazmak üzereydim. Regex kullanmanın bir uygulama detayı olduğuna katılıyorum. Önemli olan şeylerin olması gerektiği zaman doğrulaması ve olması gerektiği zaman doğrulamamasıdır. FooValidatorGirdi ve çıktılarını test edin , ardından nasıl yapıldığına dair hiçbir endişeniz yok . ++
RubberDuck

21

Regex güçlü bir araç olabilir, ancak karmaşık regex'lerde bile küçük değişiklikler yaparsanız, çalışmaya devam edeceğinize güvenebileceğiniz bir araç değildir.

Öyleyse, kapsaması gereken vakaları belgeleyen çok sayıda test oluşturun. Doğrulama için kullanılıyorsa, başarısız olması durumunda davaları belgeleyen çok sayıda test oluşturun.

Regex'lerinizi değiştirmeniz gerektiğinde yeni vakaları test olarak ekler, regex'inizi değiştirir ve en iyisini umarsınız.

Genelde birim testleri kullanmayan bir organizasyonda olsaydım, yine de kullanacağımız herhangi bir ifadeyi test edecek bir test programı yazardım. Zorunda olsam bile kendi zamanımda yapardım, saçlarımın daha fazla renk kaybetmesine gerek yok.


3

Normal ifadeler, uygulamanızın geri kalanıyla birlikte koddur. Kodun genel olarak yapmasını beklediğiniz şeyi yaptığını test etmelisiniz. Bunun birkaç amacı var:

  • Test çalıştırılabilir dokümantasyondur. Yapmanız gereken kodun neye ihtiyacınız olduğunu açıkça gösterir. Test edilmişse önemlidir.
  • Gelecekteki koruyucular, değiştirirlerse, testlerin davranışın değişmemesini sağlayacağından emin olabilirler.

Diğerleriyle gömülü farklı bir dilde kod yazarak aşılması gereken bir engel olduğundan, büyük olasılıkla bu bakımın yararına bu dikkat göstermelisiniz.


1

Kısacası, başvurunuzu, sürenizi test etmelisiniz. Regex'inizi, daha büyük bir kara kutunun parçası olarak ya da sadece elle oynarsanız, yalıtılmış bir şekilde çalıştıran otomatik testlerle test edip etmediğinden emin olmak için ihtiyacınız olan noktaya ikincildir.

Birim testlerinin temel avantajı, zaman kazanmalarıdır. Şu anda veya gelecekte herhangi bir noktada istediğiniz kadar sınamanıza izin veriyorlar. Regex'inizin herhangi bir noktada yeniden kırılacağına, çimdikleneceğine, daha fazla kısıtlama alacağına vb. İnanacağına dair herhangi bir neden varsa, o zaman evet, muhtemelen bunun için bazı regresyon testleri istersiniz veya değiştirdiğinizde, gitmek zorundasınız. bir saat boyunca tüm davaları düşünerek kırmadın. Bu, ya da kodunuzdan korkmakla yaşamayı öğrenir ve asla değiştirmezsiniz.


3
Anlamaya başladığım bir kural; Eğer kodu yazmak ve incelemek için dokümanlar gerekiyorsa, bir birim testine ihtiyacım olacak. Bana çok fazla baş ağrısı, boş işaretçiler, hiçbir tip ve yanlış sonuç yakalamadan kurtardılar. Ayrıca, son kullanıcıya kaçınılmaz şekilde kırıldığında kodunuzu en az çabayla belirtebilmesi için tamir yeteneği verir.
Aaron3468

-1

Öte yandan: Kendileri nadiren bazı birimlerin arayüzünün bir parçasıdır. Arabirimi yalnızca sınamak ve bunu regex'leri dolaylı olarak sınamak üzere yapmak daha iyi olabilir.

Bence bununla kendin cevap verdin. Bir birimdeki regex'ler büyük olasılıkla bir uygulama detayıdır.

SQL'inizi test etmek için kullandığınız şey muhtemelen regex'ler için de geçerli. Bir SQL parçasını değiştirdiğinizde, muhtemelen ne beklediğinizi verip getirmediğini görmek için elinizle bazı SQL istemcilerinden geçirirsiniz. Aynı şey bir regex değiştirdiğimde de olur, ne beklediğimi yapıp yapmadığını görmek için bazı örnek girdilerle bazı regex aracı kullanırım.

Yararlı bulduğum şey, regex'in yakınında, uyması gereken bir metin örneği içeren bir yorum.


Bir SQL parçasını değiştirdiğinizde, muhtemelen ne beklediğinizi verip getirmediğini görmek için elle bir SQL istemcisiyle çalıştırıyorsunuz. ” regex'leri elle test et, sonra bunun için bir birim testi yapmalıyım. Kesinlikle bu karar vermesi zor bir şey!
Lii

Bu gerçekten bağlıdır. Ünitenizin test etmesini istediğiniz şey değişiklik yapma yeteneğidir. Belirli bir regex'i ne sıklıkla değiştirirsiniz? Cevap genellikle ise, elbette, bunun için bir test oluşturun.
Christiaan

8
Diğer tüm şeylerin eşit olması durumunda, otomatik olarak yapılan bir teste sahip olmak, "elle yapılan testten" daha iyidir.
Robert Harvey,

1
Bir regex'i otomasyon kullanarak neden test etmediniz?
Tony Ennis

1
Bu bir yöntemin bir parçası ve söylemeye çalıştığım tek şey, eğer zaten bu yöntemi test ettiyseniz, regex'i özel olarak test etmeniz gerekmediğidir. Fakat eğer yaparsanız, regex'i yalıtımlı olarak test ettiğiniz ayrı bir işleve çıkarmaktan muhtemelen daha iyidir.
Christiaan

-5

Sormak zorundaysan, cevap evet.

Bazı FNG'lerin geldiğini ve regex'inizi "iyileştirebileceğini" düşündüğünü varsayalım. Şimdi, o bir FNG, yani otomatik olarak bir aptal. Kesinlikle, hiçbir koşulda değerli kodunuza dokunmaması gereken kişi ! Ama belki de PHB ya da başka bir şeyle ilgili olduğu için yapabileceğin bir şey yok.

PHB'nin her şeyi kötüye gittiğinde, "belki de adama bu pisliği nasıl yaptığın hakkında bazı ipuçları vermesi" için tekmeleyip bu projeye çığlık atacağını biliyorsun. Böylece , güzel ifade ifadesi ustalığınızı oluştururken dikkatlice düşündüğünüz tüm durumları yazıyorsunuz .

Ve hepsini yazdığınızdan beri, bir dizi test senaryosuna sahip olmanın yolunun üçte ikisini alıyorsunuz, çünkü - bununla yüzleşelim - regex test davaları, çerçeveyi oluşturduktan sonra çalıştırılması çok kolay.

Öyleyse, şimdi bir dizi üstün koşul, alternatif ve beklenen sonuç var. Ve aniden test vakaları, tüm bu ben-çevik blog yazılarında söz verildiği gibi belgeler . FNG’ye sadece “iyileştirilmesi” mevcut sınavlardan geçmediği takdirde, bunun bir gelişme olmadığı, değil mi? Ve orijinal koduyla ilgili bazı problemler gösteren yeni test senaryoları nerede çalışıyor , çalıştığından beri hiçbir zaman değiştirilmesi gerekmiyor !!!


3
FNG nedir? Bu bana kötü bir cevap gibi görünmüyor, ancak FNG için tanım tanımı eksik (bunun için googlin ilgisiz sonuçlar veriyor, bu yüzden belki bu cevap FNG nedeniyle sadece reddedildi?)
GameDeveloper

1
Google’ın sizi doğru yere götürdüğünden şüpheleniyorum. ;-) ( en.wikipedia.org/wiki/FNG_syndrome )
Austin Hastings

Mutlak bir programlama dehası olmadıkça, yeni adama baktıklarını düşündüğünüzü düşünerek daha deneyimli programcılar olacak. Daha mütevazi olmayı düşünebilirsiniz.
Thorbjørn Ravn Andersen
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.