Bu sayfadaki yazılar
Sayfanın metni
Sayfa 68
Diyelim ki kapalı kutu testleriyle başladınız. Speklere baktınız ve görebildiğiniz sınır koşulları ve denklik sınıflarını kullanarak 50 tane test birimi hazırladınız. Sonra bu testlerin sağladığı kod kapsamasını ölçtünüz ve 65 çıktı. Ardından şeffaf kutu yaklaşımına geçtiniz. Uğranmayan kod dallarını tespit edip onların bir kısmına uğranmasını sağlayacak şekilde 10 tane daha test birimi eklediniz. Tekrar kapsamayı ölçtünüz ve çıktı. Biraz inceleyince neden bazı kod dallarına hiç uğramadığınızı gördünüz. Mesela şöyle kodlar var.
cSoldier oSoldier - new Soldier( kBlue ); if ( oSoldier NULL )( Std:tcout <& "bellek bitti" << std::endl; exit 1;
veya;
XYZLibraryError t oError - XYZlLibraryInit(); if ( oError !— XYZ NO ERROR )( std::cout << "XYZ kutuphanesini baslatamadim" ec exit 1;
bu tip if'lerin içine giremiyorsunuz, çünkü bazı ekstra hatalar olması gerekiyor. Sizin testlerinizde doğal olarak makinenizin belleği normal şartlarda bitmiyor ve XYZ kütüphanesi hep başarıyla başlayabiliyor.
Bu noktada mevcut kapsama değerleriyle yetinip daha fazla test birimi üretmeyebilirsiniz. Bu çoğu zaman mantıklı bir karardır. Bazı projelerde bundan fazlası gerekebilir. Mesela Aya İniş Modülünün yazılımını yazıyorsanız ve oradaki astronota "pardon ya bellek bitti ben çıkıyorum" diyemeyeceğiniz için, bu tip hata koşullarının da test edilmesi gerekebilir. İşte bu test yaklaşımına da "Hata Enjeksiyonu" deniyor.
Hata enjeksiyonu yapmak değişik şekillerde mümkün olabilir. Kütüphaneler yerine aynı arayüze sahip ve sizin istediğiniz hataları döndüren taklit fonksiyonlar (bunlara stub denir) yazabilirsiniz. Ya da test ettiğiniz sistemde bir takım harici araçlarla hata koşullarını yaratabilirsiniz.
Sonuç
Yazılım doğrulama alanı yazılım geliştirmeye göre daha yeni ve fazla çözülmemiş bir alandır. Fakat yine de yazılım geliştirme projelerinde kaliteyi ve ilerlemeyi ölçen önemli bir metrik sağlar. Yazılım doğrulamanın alt alanlarından kısaca bahsettiğimiz ve Test Birimi tasarlamanın temellerine giriş yaptığımız bu yazı umarız ileriki projelerinizde faydalı olur.
nightlord (at) nightnetwork (nokta) org
Yararlanılan Kaynaklar:
* Testing Computer Software 2nd Ed.; Kaner, Falk, Nguyen
How to Break Software: A Practical Guide to Testing; Whittaker
Ship it! A Practical Guide to Successful Software Projects; Richardson, Gwaltney
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 69
Commodore 64
Şekil 1.
$F5C1 (62913) adresinin en son yükletilen dosyayı ekrana yazdığını biliyor muydunuz?
load"program",8,1 sys 62913
Eğer dosyayı load"*",8,1 şeklinde yüklediyseniz ekrana * karakteri yazılacaktır. Yani bu komut sizin yüklediğiniz en son dosya isminin tutulduğu tampon belleği ekrana yazar. Peki nerede bu tampon bellek? $a000 adresi Basic ROM'unun başladığı adrestir. Yükletilen dosya isminin uzunluğuna bağlı olarak bu bellek alanı $9fff'den geriye doğru kullanılır, yani Basic ROM'unun başlangıcından geriye doğru. Örneğin dosyayı "*" ile yüklemişsek bellek başlangıcı tam olarak $9fff'de yer alır. Ama "dutch breeze" diye bir dosya yüklediysek, dosya ismi 12 karakter olduğu için $a000-12 = $9ff4 adresinden itibaren hafızaya yerleşecektir. Bu bellek adresinin başlangıcı ise zeropage'de $bb ve $bc adreslerinde 16 bit şeklinde durur. Örneğin "dutch breeze" için $bb = $f4, $bc = $9f gibi.
6510 ASM'de hiçbir flag'i (zero flag, carry flag v.b.) etkilemeyen komutlar nelerdir?
NOP, JSR, JMP, PHA, PHP, RTS, STA, STX, STY. Bu komutlar haricindeki tüm 6510 assembler komutları en az bir flag'i etkiler.
$D011'e sıfır değeri verdiğimizde DMA satırlarından kurtuluyoruz ve iç ekran kapanıyor ancak bu sefer sprite veya herhangi bir grafik göstermemiz mümkün olmuyor. FLD kullanmadan kolay bir şekilde yalnızca karakter ekranını kapatarak DMA'dan kurtulmanın bir yolu var mıdır?
Olmasa ne diye uzun uzun yazayım bu soruyu :) Birbirine benzer iki yolu var bunun. Birincisi 48. raster satırında ($30) $d011'i kapatıp (0'a eşitleyip) 1-2 raster satırı kadar bekledikten sonra yine $d011'in 3 numaralı bitini set edecek olursak (örneğin 8 değerine eşitleyecek olursak) karakter ekranı kapandığı halde sprite'lar ve bankın sonundaki adres ($3fff, $7fff, $bfff ya da $ffff) görüntülenebilir. Kısacası FLD tekniğinin yarattığı etkinin aynısı yaratılmış olur. Avantajı ise 200 raster satırlık tüm ekranın DMA'larını 1-2 raster satırı zaman harcayarak yok edilebilmesidir.
İkinci yöntem ise bunu ekranın bitiminde 248. raster satırı civarında yapmaktır. Ancak bu durumda ekstra kazancımız alt ve üst border'ların da açılmasıdır. Bu alanlara da sprite basabiliriz bu yöntemle.
Şimdi 48. raster satırını kullanarak yaptığım bir örneği inceleyelim. Bu örnekte $3fff adresi kullanılarak iç ekranda dikey çubuklar kaydırılıyor. Bunun haricinde 50. raster satırdan ($32) itibaren 254 raster satırı boyunca hiçbir ekstra zaman tablosu içermeyen bir döngüyle raster çekebiliyoruz. ACME ile derlemenizi öneririm.
to "nobadlines.prg",cbm
WAIT ldy dey bne
.Vv 1 #.v *-—1
*
$0801 !byte $0c, !byte $9e, !byte $31,
$08, 532; $00,
$00, $30, $00,
$00 $36 $00
*
lda sta sei
$080d #$01
Start: lda cmp bne lda #$00 sta *WAIT 24 lda #$0b sta $d0l1 lda #$31 cmp $d012 bne *-3 lda #$1b sta *WAIT 8 bit $ea ldx #$00
#$30 $d012 *-3
loopl1: txa sta $d020 sta $d021 *WAIT 9 inx Ccpx bne asl bne inc İmp
#254 loopl start $3fff start