Yazılım Kusur Enjeksiyon (Fault Injection) Testi, ISO 26262 gibi bazı emniyet-kritik yazılım geliştirme standartlarında kullanılması önerilen bir test yöntemidir. ISO 26262’de şu şekilde tanımlanmaktadır [1]:
Bir sistemdeki emniyet mekanizmaları test etmek amacıyla, sisteme kasıtlı şekilde hatalar (yazılım veya donanım parçalarını bozmak, değişken değerlerini bozmak, yazılım kaynak kodunda mutasyonlar yapmak veya CPU yazmaç değerlerini bozmak gibi) eklenmesi ile gerçekleştirilen testlerdir.
Yazılım Kusur Enjeksiyon (Fault Injection) Testi ISTQB tarafından hazırlanan yazılım test terimleri sözlüğünde ise aşağıdaki gibi tanımlanmaktadır [2]:
Bir sisteme kasıtlı bir şekilde hata ekleyerek, o sistemin hataları tespit edebilme ve hatadan kendisini kurtarabilme yetisini anlamak amacıyla gerçekleştirilen süreç.
Yazılım Kusur Enjeksiyon testlerinde, başlıca iki yöntem kullanılarak test senaryoları tasarlanmakta ve gerçekleştirilmektedir [3]:
Yazılım kaynak kodunda kusurlara(fault) yol açacak değişiklikler yapma
Yazılım kaynak kodunu değiştirmeden, yazılımın etkileşimde olduğu donanım, diğer yazılımlar veya yazılımın kullandığı veri kaynaklarında değişiklikler yaparak kusur(fault) durumları oluşturma
Yazılım Kusur Enjeksiyon testleri tasarlanırken, oluşturulacak kusurlar yazılımın çalışması esnasında (run-time) veya yazılımın çalışması öncesinde (pre run-time) oluşturulabilir [4]. Yazılımın çalışması esnasında kusur oluşturmak için, genellikle çalışan yazılım belirli bir noktada durdurulup, kusur oluşturulup yazılım çalışmaya devam ettirilmektedir. Bu yöntemde gerçekleştirilen test koşuları, yazılımın çalışması öncesinde (pre run time) kusur eklenmesi yöntemine göre daha uzun sürmektedir.
Yazılım Kusur Enjeksiyon test senaryoları hazırlanırken; zamanlama hataları, verilerde bozulmalar, asimetrik hatalar, erişim hataları ve program akışına yönelik hatalar kullanılabilir [5]. Verilerde bozulma durumu yaratmak için örneğin hafızada tutulan global değişkenlerin değerleri anlık olarak değiştirilerek(bozularak) yazılımın davranışı gözlemlenebilir. Asimetrik hata durumları oluşturmak için, aynı mesajı alıp işleyen yazılım birimlerine, aynı çevrimde farklı mesaj gönderilebilir. Böylece sistemin normal işleyişi esnasında oluşması beklenmeyen bir durum yaratılmış olur ve sistemin bu durumdaki davranışı gözlemlenebilir. Zamanlama hatalarına örnek olarak, yazılım birimlerine gelen mesajların erken, geç veya hiç gönderilmemesi şeklinde test senaryoları verilebilir.
Yazılım Kusur Enjeksiyon test senaryoları çalıştırılırken, kusur durumu oluşturulup yazılım çalıştırılmaya devam ettiğinde, aşağıdaki durum ve/veya alt durumlar gözlemlenebilir [3]:
Yazılım normal şekilde çalışmaya devam eder, herhangi bir arıza (failure) gözlemlenmez.
Yazılımda arıza(failure) gözlemlenmez, ancak yazılım yanlış çalışma durumlarına girip hatalı şekilde çalışmaya devam eder. (undetected failure)
Yazılımda arıza (failure) gözlemlenir:
Gözlemlenen arıza (failure) diğer yazılım ve sistem bileşenlerini etkileyebilir.
Gözlemlenen arıza (failure) yazılımdaki çeşitli mekanizmalar aracılığıyla düzeltilir.(örneğin yazılımın yeniden başlatılması gibi)
Yazılımda çökme (crash) meydana gelebilir.
Yazılımda oluşan arıza (failure) kullanıcıya bildirilebilir.
Yazılım Kusur Enjeksiyon testleri ile normal durum test senaryoları esnasında test edilemeyen, hata/arıza durumlarını ele alma mekanizmaları test edilmiş olur. Bu mekanizmaların arıza(failure) durumlarında ne derece başarılı olduğu gözlemlenmiş olur. Ayrıca tespit edilemeyen arıza durumlarının (undetected failures) olup olmadığı ve tek hatadan sistem seviyesi ölümcül (catastrophic) sonuçların oluşup oluşmadığı da Yazılım Kusur Enjeksiyon testleri sonucunda görülecektir. Yazılım Kusur Enjeksiyon testleri esnasında, gözlemlenen hataların diğer yazılım ve sistem bileşenlerini de etkilediği tespit edilecek olursa, yazılım tasarımında ve kaynak kodunda çeşitli iyileştirmeler yapılarak bu tip olumsuz etkiler en aza indirilebilir. Dolayısıyla Yazılım Kusur Enjeksiyon testleri, emniyet-kritik yazılımlarda bulunan özellikle kritiklik seviyesi yüksek bileşenler için yapılması gerekli testlerdir. ISO 26262 standardı, standartta tanımlı en yüksek kritiklik seviyesi olan ASIL D seviyesi yazılımlar için Yazılım Kusur Enjeksiyon testlerini “oldukça tavsiye edilir (highly recommended)” olarak tanımlarken, daha düşük kritiklik seviyeleri olan ASIL A, B ve C için “tavsiye edilir (recommended)” şeklinde tanımlamaktadır.
Rafta Hazır Ticari (Commercial off the shelf - COTS) yazılım parçalarının kullanılması durumunda da Yazılım Kusur Enjeksiyon testlerinin yapılması, iç yapısı ve tasarımı tam olarak bilinmeyen bu hazır yazılım parçalarının davranışını anlamak adına tavsiye edilmektedir. Yazılımın proje kapsamında geliştirilen kısımlarında kusur durumları oluşturularak, bu kusur durumlarının COTS yazılım parçalarının çalışma davranışlarında herhangi bir probleme yol açıp açmadığı Yazılım Kusur Enjeksiyon testleri sayesinde gözlemlenebilir.
Yazılım Kusur Enjeksiyon testleri, ISO 26262 standardında olduğu gibi NASA’nın hazırladığı “NASA Software Safety Guidebook” dokümanında da özel emniyet test teknikleri arasında sıralanmaktadır [6]. Benzer şekilde kritik bileşenler için bu testlerin yapılması gerektiği dokümanda belirtilmektedir. DO-178C rehber dokümanında ise, Yazılım Kusur Enjeksiyon (Software Fault Injection) testine yönelik bir tanım veya amaç bulunmamakla birlikte, bu testler “gürbüzlük (robustness)” testleri kategorisinde değerlendirilebilir. DO-178C uyumlu yazılım geliştirme projelerinde, “gürbüzlük (robustness)” test senaryoları hazırlanırken, Yazılım Kusur Enjeksiyon testleri de dikkate alınmalıdır. Ayrıca DO-178C uyumlu yazılım geliştirme projelerinde, gereksinimler gereği yazılım kaynak kodunda bulunan hata işleme mekanizmalarının tam olarak test edilebilmesi ve yapısal kapsamasının sağlanabilmesi adına Yazılım Kusur Enjeksiyon testlerinin gerçekleştirilmesi faydalı olacaktır.
Kaynaklar:
[1] ISO, “ISO 26262:2018 Road vehicles — Functional safety”, 2018.
[2] ISTQB, “ISTQB Yazılım Testi Terimler Sözlüğü, Versiyon 1.0”, Yazılım Test ve Kalite Derneği, 2014.
[3] R. Natella, D. Cotroneo ve H. S. Madeira, “Assessing Dependability with Software Fault Injection : A Survey”, ACM Computing Surveys, vol.48, issue.3, 2016.
[4] U.S. Nuclear Regulatory Commission,”Development of a Fault Injection-Based Dependability Assessment Methodology for Digital I&C Systems”, NUREG/CR-7151, Vol. 1, 2012.
[5] P. Jihyun, ve B. Choi. "ASFIT: AUTOSAR-Based Software Fault Injection Test for Vehicles", Electronics 9, no. 5, 2020.
[6] NASA, "NASA Software Safety Guidebook", 2004.
コメント