Nasıl bir prosedür kod temeli PHP ile ünite testleri yazıyorsunuz?

3 Cevap php

Ben birim test faydaları çoğunlukla eminim ve ben PHP ile yazılmış bir büyük varolan kod temeli kavramını uygulamaya başlamak istiyorum. Bu kodun% 10'undan azı nesne yönelimli değildir.

Ben birkaç birim test çerçeveler (PHPUnit, SimpleTest ve pHPT) baktım. Ancak, usul kodu sınamak olduğunu bunlardan herhangi biri için örnek bulamadık. Ne benim durum için iyi bir çerçevedir ve non-NYP kullanılarak birim test PHP herhangi bir örnek vardır?

3 Cevap

Sen birim test usul PHP, hiçbir sorun olabilir. Kod HTML ile karışık Ve eğer şans kesinlikle değiliz.

Uygulama veya kabul test seviyesinde, usul PHP muhtemelen davranışını belirlemek için superglobals değeri ($_POST, $_GET, $_COOKIE, vb) bağlıdır ve bir şablon dosyasını da dahil olmak üzere ve çıkış tükürerek biter.

To do application-level testing, you can just set the superglobal values; start an output buffer (to keep a bunch of html from flooding your screen); call the page; assert against stuff inside the buffer; and trash the buffer at the end. So, you could do something like this:

public function setUp()
{
    if (isset($_POST['foo'])) {
        unset($_POST['foo']);
    }
}

public function testSomeKindOfAcceptanceTest()
{
    $_POST['foo'] = 'bar';
    ob_start();
    include('fileToTest.php');
    $output = ob_get_flush();
    $this->assertContains($someExpectedString, $output);
}

Değil çalışma veya uygulama düzeyinde özelliklere sahip bile içeren bir sürü muazzam "çerçeveler" için, test bu tür size söyleyecektir. Bu, kod geliştirme başlamak gibi veritabanı bağlayıcı hala çalışıyor ve eskisinden daha iyi görünüyor ikna olsanız bile, bir düğmesini tıklatın ve evet, hala can, bu görmek isteyeceksiniz, çünkü gerçekten önemli olacak giriş ve veritabanı üzerinden çıkış.

Düşük seviyelerde, değişken kapsamı ve fonksiyonları (doğru veya yanlış dönen) veya doğrudan sonucu dönmek yan etkileri çalışması olup olmadığına bağlı olarak küçük farklılıklar bulunmaktadır.

Değişkenler fonksiyonlar arasındaki parametre parametreleri ya da diziler, açıkça etrafında geçti mi? Veya değişkenler pek çok farklı yerlerde ayarlanır ve globaller gibi dolaylı geçirilir? O (iyi) açık durumda ise, ünite (1) (2) doğrudan fonksiyon testi değerleri, beslenme ve (3) çıkışını yakalayan ve buna karşı iddia sonra, işlevini tutan dosyasını dahil ederek bir işlevi test edebilirsiniz. Eğer küresellerle kullanıyorsanız, sadece ($ _POST örnekte, yukarıdaki gibi) ekstra dikkatli olmak zorunda testlerinin arasındaki tüm globallerinin dikkatle null. Bu globalsin çok iter ve çeker bir işlevi ile uğraşırken (1-2 öne sürer, 5-10 çizgiler) çok küçük testleri tutmak için de özellikle yararlı olur.

Bir başka temel sorun işlevleri çıktı iade ederek işe, ya da, geçirilen params değiştirerek yerine doğru / yanlış dönerek olup olmadığıdır. İlk durumda, test edilmesi daha kolay olmakla birlikte, yine de, her iki durumda da mümkündür:

// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
  $stringOne = 'foo';
  $stringTwo = 'bar';
  $expectedOutput = 'foobar';
  $output = myCustomCatFunction($stringOne, $stringTwo);
  $this->assertEquals($expectedOutput, $output);
}

Kodunuzu yan etkileri çalışır ve doğru veya yanlış döndürür nerede kötü durumda, yine oldukça kolay test edebilirsiniz:

/* suppose your cat function stupidly 
 * overwrites the first parameter
 * with the result of concatenation, 
 * as an admittedly contrived example 
 */
public function testShouldConcatenateTwoStringsAndReturnTrue()
    {
      $stringOne = 'foo';
      $stringTwo = 'bar';
      $expectedOutput = 'foobar';
      $output = myCustomCatFunction($stringOne, $stringTwo);
      $this->assertTrue($output);
      $this->Equals($expectedOutput, $stringOne);
    }

Umarım bu yardımcı olur.

Ne birim testleri iyi yapmak ve size bazı girdilerin sayısını vermek ve geri dışarı çıkışların bir numara almak için bekliyoruz kodu bir parça var, ne sizin için bunları kullanmak gerektiğidir. Daha sonra işlevsellik eklemek zaman fikir varlık, sizin sınamaları çalıştırmak ve hala eski fonksiyonelliğini aynı şekilde performans emin yapabilirsiniz.

Bir prosedürel kod tabanı varsa Yani, test yöntemleri içinde işlevlerini çağırarak gerçekleştirebilirsiniz

require 'my-libraries.php';
class SomeTest extends SomeBaseTestFromSomeFramework {
	public function testSetup() {
		$this->assertTrue(true);
	}

	public function testMyFunction() {
		$output = my_function('foo',3);

		$this->assertEquals('expected output',$output);
	}
}

PHP kod tabanları ile bu hile genellikle kütüphane kodu kod temeli olarak, test çerçeve çalışırken müdahale edecek ve test çerçeveler paylaşılan bir web tarayıcısında bir uygulama ortamı (session, kurmayla ilgili bir sürü kod olacak, bir global değişkenler, vb.) Eğer kitaplık kodu içeren ve bir kir basit bir test (yukarıda testSetup işlevi) çalıştırabilirsiniz bir noktaya almak bazen harcama bekliyoruz.

Kodunuzu işlevleri vardır, ve PHP sadece bir dizi olduğunu çıkış HTML sayfaları dosyaları vermezse, ne tür şans bitti. Sizin kod birim test sizin için çok kullanım olmayacak demektir ki, farklı birimlere ayrılabilir olamaz. Sen Selenium ve Watir gibi ürünleri ile "kabul testleri" düzeyde zaman geçirmek daha iyi olurdu. Bunlar bir tarayıcı otomatik izin ve sonra formları / belirli yerlerde olarak içerik sayfalarını kontrol eder.

Sen kullanarak bir test sınıfa ait olmayan oop kod eklemeyi deneyebilirsiniz

require_once 'your_non_oop_file.php' # Contains fct_to_test()

Ve phpunit ile size test işlevi tanımlayın:

testfct_to_test() {
   assertEquals( result_expected, fct_to_test(), 'Fail with fct_to_test' );
}