Drupal Web Sitenizi Test Etmek Behat ile artık daha kolay (Kapsamlı bir eğitim)
Yayınlanan: 2020-09-08Zeka ve bilgeliğin kralı Tyrion Lannister, “Dünyada iyi bir hikayeden daha güçlü hiçbir şey yoktur” dedi.
Hikayelerin ve iyi iletişimin gücü, işbirliğine dayalı ve verimli bir yazılım teslimini güçlendirir. Çevik metodolojilerden gelişen Davranış Odaklı Geliştirme (BDD) teknolojileri, test sürecini otomatikleştirmek için bu gücü sonuna kadar kullanır. Behat , "her yerde bulunan dil" kullanarak otomatik teste olanak sağlayan böyle bir BDD teknolojisidir. Behat, Mink, Gherkin ve Drupal'da nasıl uygulanacağı hakkında daha fazla bilgi edelim.

Behat nedir?
Behat, Behavior Driven Development'tan (BDD) yararlanarak testleri otomatikleştirmek için kullanılan açık kaynaklı bir PHP çerçevesidir. Bir BDD yaklaşımı, sürekli iletişime ve basit metin öykülerine odaklanarak kaliteli yazılım teslimini sağlar. BDD ile test cihazı, insan tarafından okunabilir bir dilde test senaryoları oluşturur. Bu nedenle, ürün sahibinden geliştiriciye kadar herkesin anlayabileceği ve mevcut senaryo hakkında sürekli geri bildirim alabileceği tüm ekibi aynı sayfada toplamak kolaydır.
Kornişon nedir?
Behat aracı tarafından kullanılan dil, iş tarafından okunabilen ve alana özgü bir dil olan Gherkin'dir. Gherkin ayrıca canlı bir belgeleme işlevi görür ve her bir test çalışmasını belgelemek için raporlar oluşturulabilir. Bu basit boşluk tabanlı dil, basit dil sözcüklerini anahtar sözcük olarak kullanır. Girintiler (boşluk/sekme kullanılarak) ve satır sonları, test senaryosunun yapısını tanımlar. Dili yazmak ve anlamak kolay olsa da, nihai sonuç daha iyi işbirliği, verimlilik, otomasyon ve izlenebilirlik sağlamaya odaklanmalıdır. Test senaryoları sezgisel olarak yazılmalı, önemli unsurlara odaklanmalı, mükerrer kayıtları kontrol etmekten kaçınmalı ve iyi dilbilgisi kullanmalıdır.
Mink nedir?
Mink, web uygulamasıyla bir test senaryosunu simüle eden açık kaynaklı bir tarayıcı denetleyicisidir. Test senaryoları yazıldıktan sonra yürütülmesi ve kullanıcı eylemlerini taklit etmesi gerekir. Mink ile aynı test senaryosunu kullanabilir ve bunu Goutte, Selenium, Chrome, Zombie ve daha fazlası gibi çeşitli tarayıcı emülatörlerinde çalıştırabilirsiniz. Behat Drupal uzantısını kurarken Mink'e bir bağımlılık göreceksiniz, bu yüzden onu da kurduğunuzdan emin olun.
Drupal'da Behat kurulumu ve uygulaması
Drupal projenize Behat'ı kurmanın resmi yolu Composer'dır. Sadece sizin için Behat'ı yüklemekle kalmaz, aynı zamanda daha sonra bir sürüm çıktığında sizi en son sürüme kolayca güncelleyebilir.
• Proje klasörünün içinde şu komutu çalıştırın:
$ besteci behat/behat gerektirir
• Veya composer.json dosyanızın içine require ifadesini ekleyin
"gerekmek": {
"behat/behat": "^3.0.0",
"phpunit/phpunit": "^5.0.0"
}
• Ardından, terminalde besteci yükleme komutunu çalıştırın.
• Tamamlandığında, içinde Behat dosyası bulunan yeni bir bin / dizini göreceksiniz. Bu, Behat yürütülebilir dosyasıdır ve bunu testlerinizi çalıştırmak ve hata ayıklama bilgilerini almak için kullanacaksınız.
• Ardından, projenin kök klasörü içinde behat.yml adlı bir dosya oluşturun. Behat çalıştığında, yapılandırması için kullandığı bir behat.yml dosyası arar.
varsayılan:
süitler:
varsayılan:
bağlamlar:
- Drupal\DrupalExtension\Context\DrupalContext
uzantılar:
Behat\MinkUzantısı:
gut hastalığı: ~
base_url: http://example.org/ # Sitenizin URL'si ile değiştirin
Drupal\DrupalUzantısı:
kara kutu: ~Projeyi başlatmak için şu komutu çalıştırın:
satıcı/bin/behat –init
Bu özellikler / klasör ve özellikler / klasörünün içindeki bir önyükleme / FeatureContext.php varsayılan bağlam dosyası oluşturur.
Behat ile Hikaye Yazma ve Test Çalıştırma
Amacımız hikayeleri en etkili şekilde anlatmaktır. Hikayeler, insan tarafından okunabilir bir dilde, Gherkin uzantısıyla yazılmıştır. özellikler / dizin altındaki özellik .
Diyelim ki sitenizde Temel sayfa içerik türüne başarılı bir şekilde içerik ekleyip ekleyemediğinizi test etmeniz gerekiyor. Bunu yapmak için, alanları doldurmak ve yönetici olarak kaydetmek için sayfaya erişiminiz olmalıdır.
O halde ilk hikayemizi yazalım:
Özellik: Temel sayfa CT'sini kontrol edin Sayfa oluşturmak için yönetici olarak /düğüm/ekle/sayfaya erişmek istiyorum Bir sayfa oluşturabilmem için Senaryo: Temel Sayfa BT "Yönetici" rolüne sahip bir kullanıcı olarak oturum açtığım göz önüne alındığında "/node/add/page" e gittiğimde Ve "edit-title-0-value" için "Temel sayfa başlığı" giriyorum "Düzenle-gönder"e bastığımda Sonra "Temel sayfa Temel sayfa başlığı oluşturuldu" görmeliyim
Bu dosya basic_page.feature olarak adlandırılabilir. Her özelliğin, özelliğin belirli davranışını tanımlayan birçok senaryosu olabilir. Her senaryonun bölümleri olacaktır:
• Verilen - sistemin başlangıç durumunu detaylandırır
• Ne zaman - kullanıcının gerçekleştirdiği eylemi içerir
• Sonra - kullanıcının işlem yaptıktan sonra ne gördüğünü açıklar
• Ve - senaryodaki bağlantıyı sürdürmek için.
Sonra, Ve ve Ama arasında pek bir fark yoktur. Bu kelimeler, senaryolarınızı doğal ve okunabilir kılmak için hazırlanmıştır.

Tüm özellik dosyaları satıcı/bin/behat tarafından çalıştırılabilir. Belirli bir özellik dosyasını çalıştırmak istiyorsanız, satıcı/bin/behat özellikleri/basic_page.feature'ı çalıştırın. Senaryonun tanımlandığı yere sadece bir satır numarası ekleyerek tek bir senaryoyu çalıştırmanın bir yolu da vardır: satıcı/bin/behat feature/basic_page.feature:11 .
Satıcı/bin/behat -dl gibi senaryolarda kullanılan tüm ifade sözdizimini sağlayan komutlar vardır ve satıcı/bin/behat -di örneklerle birlikte sözdizimini sağlar.
Özellik dosyaları nasıl yazılır
Behat, web sitenizdeki URL'lere karşı kıvrılma istekleri çalıştırır, bu da test sürecini oldukça hızlı hale getirir, ancak aynı zamanda Behat'ın Javascript gerektiren özellikleri test etme yeteneğini kaybetmesine neden olur. Bu nedenle, özellikleri test etmek için Javascript gerektiren her senaryodan önce aşağıdaki gibi @javascript etiketi eklememiz yeterlidir: Özellik: Temel sayfa CT'sini kontrol edin Sayfa oluşturmak için yönetici olarak /düğüm/ekle/sayfaya erişmek istiyorum Bir sayfa oluşturabilmem için @api @javascript Senaryo: Temel Sayfa BT "Yönetici" rolüne sahip bir kullanıcı olarak oturum açtığım göz önüne alındığında Ben "/ düğüm / ekleme / sayfa" gittiğinizde Ve "edit-title-0-value" için "Temel sayfa başlığı" giriyorum Ve "edit-body-0-value" alanındaki wysiwyg'i "Temel sayfa içeriği" ile dolduruyorum Ben bastığınızda "düzenlemek göndermek" Sonra "Temel sayfa Temel sayfa başlığı oluşturuldu" görmeliyim
Bunu test etmek için satıcı/bin/behat çalıştırın. Bu size senaryolardaki tanımsız adımları gösterecektir çünkü senaryolar bir fonksiyonla eşleşmelidir.

Kod parçacığını FeatureContext.php bağlam dosyasına kopyalayıp yapıştırabilir ya da satıcı/bin/behat --dry-run --append-snippets dosyasını çalıştırabilirsiniz .
Ardından, FeatureContext.php'deki işlevlerin tanımlarını gösterildiği gibi yazabilirsiniz:
<?php
Behat\Mink\Exception\ExpectationException kullanın;
Drupal\DrupalExtension\Context\RawDrupalContext kullanın;
/**
* Belirli bağlamdan uygulama özelliklerini tanımlar.
*/
class FeatureContext, RawDrupalContext'i genişletir {
/**
* Vizon bağlamı.
*
* @var Drupal\DrupalExtension\Context\MinkContext
*/
korumalı $minkContext;
/**
* Bağlamı başlatır.
*
* Her senaryo kendi bağlam örneğini alır.
* Ayrıca isteğe bağlı argümanları da iletebilirsiniz.
* behat.yml aracılığıyla bağlam oluşturucu.
*/
genel işlev __construct() {
}
/**
* Alanda wysiwyg doldurun.
*
* @Sonra wysiwyg alanını :locator alanında :value ile dolduruyorum
*/
genel işlev iFillInWysiwygOnFieldWith($lokatör, $değer) {
$el = $this->getSession()->getPage()->findField($lokatör);
if (boş($el)) {
throw new ExpectationException('Locator ile WYSIWYG bulunamadı: ' . $locator, $this->getSession());
}
$fieldId = $el->getAttribute('id');
if (boş($fieldId)) {
throw new Exception('Locator ile alan için bir id bulunamadı: ' . $Locator);
}
$bu->getSession()
->executeScript("CKEDITOR.instances[\"$fieldId\"].setData(\"$değer\");");
}
}Şimdi, satıcı/bin/behat komutunu çalıştırın ve yazılan tüm senaryoların geçmesi gerekir. Tanımlanan JS işlevi, “ Ve ben wysiwyg on-field "edit-body-0-value" ifadesini "Temel sayfa içeriği " ile dolduruyorum .
