opracowanie Iteracje Rys.1. Przepływ działań w iteracyjno-rozwojowym procesie powstawiania oprogramowania obiektowego udział testowania

Podobne dokumenty
Wykład 8. Testowanie w JEE 5.0 (1) Autor: Zofia Kruczkiewicz. Zofia Kruczkiewicz

Możliwe strategie tworzenia niezawodnego oprogramowania:

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Język ludzki kod maszynowy

Aproksymacja funkcji a regresja symboliczna

Algorytm. a programowanie -

Podstawy Informatyki. Algorytmy i ich poprawność

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Zasady organizacji projektów informatycznych

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Podstawy programowania w języku C

Poprawność semantyczna

testy dynamiczne uruchamianie programu testy statyczne analiza kodu

KONSTRUKCJA KOMPILATORÓW

Podstawy programowania - 1

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Testy statystyczne, funkcjonalne, strukturalne, statyczne; testy systemu

Wykładowca Dr inż. Zofia Kruczkiewicz. Zofia Kruczkiewicz Wyklad_INP002017_

Instrukcje sterujące. Programowanie Proceduralne 1

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Definicje. Algorytm to:

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Wstęp do programowania

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

Wstęp do Programowania, laboratorium 02

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Języki i metodyka programowania

Podstawy programowania (1)

Zmienne, stałe i operatory

DOKUMENTACJA. Przeznaczenie dokumentacji użytkowej. Użytkownicy końcowi Administratorzy SKŁADNIKI DOKUMENTACJI. Synteza Dokumentacja.

Maciej Oleksy Zenon Matuszyk

Podstawy programowania skrót z wykładów:

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Pytania sprawdzające wiedzę z programowania C++

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

Efekty uboczne błędów

Technologie informacyjne - wykład 12 -

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

- - Ocena wykonaniu zad3. Brak zad3

1 Wprowadzenie do algorytmiki

Poprawność algorytmów

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Podstawy programowania. Podstawy C# Przykłady algorytmów

Projektowanie oprogramowania. Wykład Weryfikacja i Zatwierdzanie Inżynieria Oprogramowania Kazimierz Michalik

Formalna weryfikacja oprogramowania w lotnictwie

Wstęp do programowania

ECDL Podstawy programowania Sylabus - wersja 1.0

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład 7. Projektowanie kodu oprogramowania

Programowanie, algorytmy i struktury danych

Praktyka Programowania

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Testowanie i walidacja oprogramowania

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Języki programowania zasady ich tworzenia

Testowanie oprogramowania. Testowanie oprogramowania 1/34

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Algorytmy od problemu do wyniku

Równania liniowe i nieliniowe

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Podstawy programowania C. dr. Krystyna Łapin

Podstawy Programowania.

Programowanie obiektowe

Proste algorytmy w języku C

Programowanie. Projektowanie funkcje programu tworzenie algorytmu i struktur danych. Programowanie implementacja algorytmu kompilacja programu

Programowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Metody Programowania

Stałe i zmienne znakowe. Stała znakowa: znak

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

Inżynieria oprogramowania

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Proste algorytmy w języku C

Język programowania PASCAL

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Wstęp do programowania

Transkrypt:

Testowanie programów 6.1. Rola testowania w tworzeniu oprogramowania Kluczową rolę w powstawaniu oprogramowania stanowi proces usuwania błędów w kolejnych fazach rozwoju oprogramowania na drodze testowania (różne metody testowania dostosowane do stopnia rozwoju oprogramowania). W inżynierii oprogramowania poszukuje się związku między strukturą programu a możliwością powstawania pewnych błędów oraz trudnością ich wykrywania na drodze testowania. Fazy etapów przepływu działań Przepływ działań Początek Dokładne opracowanie Budowa Przejście Wymagania Analiza Projektowanie Implementacja Testowanie 1-a 2-a - - - - - n-1 n Iteracje Rys.1. Przepływ działań w iteracyjno-rozwojowym procesie powstawiania oprogramowania obiektowego udział testowania 6.2. Definicje Atestowanie (validation) - testowanie zgodności systemu z rzeczywistymi potrzebami użytkownika (czy zbudowano poprawny produkt). Weryfikacja (verification) - testowanie zgodności systemu z wymaganiami zdefiniowanymi w fazie określania wymagań (czy zbudowano produkt poprawnie w kolejnych fazach życia) Błąd (fault, error, defect) jest niepoprawną konstrukcją znajdującą się w oprogramowaniu, która może prowadzić do niewłaściwego działania. Błędne wykonanie - uszkodzenie (failure) to niepoprawne działanie systemu w trakcie jego pracy na skutek błędów. Takie same błędne wykonanie może pochodzić od różnych błędów. Jednak błędy nie muszą powodować błędnego wykonania programu! Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 1

Klasyfikacja testów: 1. ze względu na cel: 1.1. testy wykrywające błędy 1.2. testy statystyczne, określające przyczyny najczęstszych błędnych wykonań oraz ocena niezawodności systemu 2. ze względu na technikę wykonania: 2.1. testy dynamiczne polegające na wykonaniu fragmentu lub całego programu i porównaniu wyników jego działania z wynikami poprawnymi. Możliwe jest wykonywanie metaprogramów wykonanych w różnych fazach powstawania oprogramowania: testy funkcjonalne i strukturalne (metaprogramy) 2.2. testy statyczne, czyli inspekcje struktury produktu, udowadnianie poprawności programu Testy dynamiczne i statyczne nie są komplementarne, tzn. mogą służyć do wykrywania różnych błędów. Kolejność wykonania testów w procesie powstawiania oprogramowania jest zależna od przyjętej metody testowania i tworzenia oprogramowania. W końcowej fazie wyróżnia się następujące testy: testy modułów testy systemu testy akceptacji ( testy alfa i beta). Klasyfikacja błędów 1) błędy wymagań i analizy: złe sformułowanie problemu, zaniedbanie istotnych parametrów, niewłaściwy algorytm, 2) błędy projektowania: błędna interpretacja wymagań, błędy logiczne 3) błędy programowe: 3.1) błędy opracowania szczegółowej struktury programu: zła interpretacja wymagań dla programu, niepełność struktury programu, nie uwzględnienie przypadków szczególnych, niedostateczne dopracowanie błędów, zlekceważenie warunków czasowych 3.2) błędy kodowania: 3.2.1) syntaktyczne, zazwyczaj rozpoznawane przez kompilator, 3.2.2) błędy merytoryczne (nieprawidłowe korzystanie z indeksów i wskaźników, zły przydział pamięci, pominięcie inicjalizacji zmiennych, pomieszanie parametrów funkcji, błąd w pętlach, zamiana wyników decyzji w instrukcjach warunkowych, błędy deklaracji typów i wymiarów danych, błędy zakresów wartości danych, 3.3) błędy kompilacji i konsolidacji: błędy kompilatora, błędy w zakresach nazw itp. Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 2

6.3. Proces testowania symbolicznego Testowanie i usuwanie błędów prowadzą do osiągnięcia dużej niezawodności programów. Jednak nawet przy dużych nakładach na testowanie można przeanalizować zaledwie małą część wszystkich możliwych kombinacji danych wejściowych wielkiego systemu oprogramowania. Uwagi dotyczące poprawy testowania: należy unikać struktur typu goto należy dostosować odpowiednio struktury danych do wykonywanych algorytmów, i na odwrót (Wirth) należy tworzyć programy łatwo modyfikowalne ze względu na struktury danych ograniczyć powiązania między modułami programu inicjować zmienne, ograniczyć zmienne globalne, rozważnie operować wskaźnikami, przydziałem pamięci, indeksami tablic (C,C++!) należy zabezpieczyć program przed przekroczeniem zakresu wartości danych i przed pomyłkami przy ich wprowadzaniu (nie należy zakładać, że ten obowiązek powinien spoczywać na użytkowniku np. zapobieganie dzielenia przez zero) Problemy testowania: trudność w określeniu możliwie najmniejszej liczby zachowań programu, wynikającego z pewnego zbioru danych, które należy sprawdzić i i uogólnić indukcyjnie uzyskane wyniki w podejściu statystycznym istnieje tendencja do ułatwiania postępowania i opierania się na często niezbyt dobrze uzasadnionych założeniach (losowy rozkład danych, wzajemna niezależność czynników badanych procesów, operowanie średnią lub wariancją) Rozwiązanie dużej liczby rozpatrywanych danych można zastąpić metodą wykonywania symbolicznego, opartej na: symbole bądź wyrażenia algebraiczne używane są jako wartości zmiennych. Instrukcje podstawienia podstawiają za zmienne wyrażenia algebraiczne wybór gałęzi przy instrukcji warunku wprowadza ograniczenia dla symboli wykonywanie symboliczne dotyczy całych, często nieskończenie wielkich zbiorów instrukcji, co ogranicza wykorzystania szczególnych atrybutów wartości, które może przybrać symbol. Przykład 6.1 Przykład symbolicznego wykonania programu sprowadzony do odpowiedniego testowania warunków bez analizowania wartości zmiennych #include "stdio.h" void main () { float x,y,z; if (scanf("%f%f",&x,&y)==2) {z=2*x + y; if (z==0) x=1; else x=1/z+1/y;}} // zabezpieczenie przed niewłaściwą formą danych x i y //zabezpieczenie przed niewłaściwą wartością danych Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 3

Przykład 6.2 [7] Testowanie błędnej wersji programu do znajdowania pierwiastka kwadratowego z p, gdy przedziału 0 p < 1 z dokładnością do err, gdzie 0 err <1. #include "stdio.h" float pierwiastek_kw(float p, float err) { float d=1, ans=0, tt=0, c=2*p; //wylicz pierwiastek kwadratowy z p, 0<=p<11 z dokładnością do err, 0 <= err < 1 if (c >= 2) return 0; //punkt rozgałęzienia A, p<1? do { if (d<=err) return ans; //punkt rozgałęzienia B d=0.5 * d; tt=c-(d+2*ans); if (tt>=0) //punkt rozgałęzienia C {ans=ans+d; c=2*(c-(2*ans+d));} else c=2*c; } while (1); //ten i kolejny wiersz powinny być zamienione } void main () {float ans,p,err; printf("podaj liczbe i dokladnosc: "); if (scanf("%f%f",&p,&err)==2) {ans=pierwiastek_kw(p, err); printf("pierwiastek kw z dokl %f z liczby %f=%f\n",err,p,ans);} } Wybrano trzy punkty rozgałęzienia: A, B, C i rozważono następujący ciąg wyborów miejscach: sekwencje wykonywane przez p Err d ans tt c program A false p < 1 1 0 0 2*p < 2 B false p < 1 err < 1 d > err 0 0 2*p < 2 C true? p < 1 err < 1 0.5 0.5 2*p - 0.5 >= 0 4*p - 3 B true, exit p < 1 err >=0.5 0.5 0.5 2*p - 0.5 >= 0 4*p - 3 A false? p < 1 1 0 0 2*p < 2 B false? p < 1 err < 1 d > err 0 0 2*p < 2 C true? p < 1 err < 1 0.5 0.5 2*p 0.5 >= 0 4*p - 3 B false? p < 1 err < 0.5 0.5 0.5 2*p 0.5 >= 0 4*p 3 C false! p < 1 err < 0.5 0.25 0.5 4*p 4.25 < 0 8*p - 6 B true exit p <1 err>=0.25 0.25 0.5 4*p 4.25 < 0 8*p - 6 Po sekwencji <A false, B false, C true, B true> mamy 0.5=ans p 1/2 + err i 0.5=ans p 1/2 - err, p=err=0.995; p 1/2 0.997 Po sekwencji <A false, B false, C true, B false, C false, B true> mamy jednak 0.5=ans < p 1/2 - err dla p=0.995, err=0.49. Program nie przeszedł pomyślnie testu, jednak nie znaleziono przyczyny błędu. Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 4

6.4. Opis techniki indukcji kontynuacyjnej Indukcja kontynuacyjna rozszerza wykonywanie symboliczne do metody dowodzenia formalnego. Przykład 6.3 [7] wejście: I := 1;R := 1; pętla: if I< N then begin I := I + 1; R := R*I ; goto pętla end wyjście: Należy zdefiniować asercję L : x = wyrażenie, która stwierdza, że istnieje pewien stan programu powstający wtedy, gdy sterowanie znajdzie się w punkcie oznaczonym etykietą L, w którym wartością symboliczną identyfikatora x jest wyrażenie algebraiczne wyrażenie. Należy udowodnić, że powyższy program oblicza wartość silni, czyli: Jeśli n 0, zaś na wejściu N = n, to na wyjściu N = n, I = n, R = n!. Dowód: Założenie N = n pętla : N = n. I = 1, R = 1 dla i = 1 udowodniono Należy udowodnić, że dla 1 i n pętla: N = n, I = i, r = i! pętla : N = n, I = i+1, R = i! * (i+1) dla i < n dla i=i+1 wyjście: N = n, I = n, R = n! Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 5

6.5. Przykłady testów Przykład 6.4 START x N y = x x N y == x NIE TAK y 0 y == x x< 0 y == x x 0 y = -x STOP y == -x x< 0 y== x Sekwencja x y A true exit x 0 y=x 0 A false exit x < 0 y = -x >0 Stąd y = x dla 0 < x i x 0 Test indukcji kontynuacyjnej Tak: x 0, y == x 0 Nie: x <0, y = =-x > 0 Stop : y == x Dowód testu pomyślny Przykład 6.5 a) START b) START true (Wejście) NIE x3=x1 x1=x2 x2=x3 x1=a x2= b x1 x2 TAK x3=x1%x2 x1 x2 nwp(a,b)==nwp(x1,x2) (1) NIE x3=x1 x1=x2 x2=x3 x1=a x2=b x1 x2 true (Wejście) TAK x1 x2 nwp(a,b)==nwp(x1,x2) (1) x3=x1%x2 x3==0 NIE TAK (Wyjście) x2==nwp(a,b) STOP x2 x3 nwp(a,b)==nwp(x2,x3) (2) TAK x3==0 STOP NIE (Wyjście) nwp(x1,x2)==nwp(a,b) x1=x2 x2= x3 Przykład 6.5 a) i 6.5.b) dotyczy wyznaczenia największego wspólnego podzielnika wyznaczonego wg algorytmu Euklidesa [7]. Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 6

Testy programu z przykładu 6.5 a) Należy wykazać, że program oblicza poprawnie wartość x2 =nwp (a,b) S oznacza następujący program C++: const int a=2; const int b=11; void main() { int x1,x2,x3; if (a>=b) {x1=a;x2=b;} //punkt A else {x1=b;x2=a;} x3=x1%x2; while(x3) // punkt B { x1=x2; x2=x3; x3=x1%x2;}} Sekwencja wykonania x1 x2 x3 A true a b x1 % x2 B true x1 = x2 x2=x3 x3 = x1 % x2 B false exit x1 = x1 x2 = x2=nwp(x1,x2) x3=x1%x2=0 A false b a x1 % x2 B true x1 = x2 x2=x3 x3 = x1 % x2 B false exit x1 = x1 x2 = x2=nwp(x1%x2) x3=x1%x2=0 Test indukcji kontynuacyjnej Tak: a b, x1=a, x2 = b, x3=x1 % x2 pętla: x3>0, x1=x2, x2= x3, x3 = x1 % x2 wyjście: x1=x1, x2=x2, x3 =x1%x2=0, x2=nwp(x1,x2)=nwp(a,b) Tak: a<b, x1=b, x2 = a, x3=x1 % x2 pętla: x3>0, x1=x2, x2= x3, x3 = x1 % x2 wyjście: x1=x1, x2=x2, x3 =x1%x2=0, x2=nwp(x1,x2)=nwp(a,b) Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 7

Testy programu z przykładu 6.5 b) Należy wykazać, że program oblicza poprawnie wartość x2 =nwp (a,b) S oznacza następujący program C++: const int a=2; const int b=10; void main() { int x1,x2,x3; if (a>=b) {x1=a;x2=b;} else {x1=b;x2=a;} x3=x1%x2; while(x3)x3=x1%x2;} Sekwencja wykonania x1 x2 x3 A true a b x1 % x2 B true x1 = a x2=b x3 = x1 % x2 B false exit? x1 = a x2 = b=nwp(a,b) x3=a%b=0 A false b a x1 % x2 B true x1 = b x2=a x3 = x1 % x2 B false exit? x1 = b x2 = a=nwp(b%a) x3=b%a=0 Test indukcji kontynuacyjnej Tak: a b, x1=a, x2 = b, x3=x1 % x2 pętla: x3>0, x1=x1, x2= x2, x3 = x1 % x2 wyjście: x1=a, x2=b, x3 =a%b=0, x2=nwp(a,b). tylko gdy b=nwp Tak: a<b, x1=b, x2 = a, x3=x1 % x2 pętla: x3>0, x1=x2, x2= x3, x3 = x1 % x2 wyjście: x1=b, x2=a, x3 =p%a=0, x2=nwp(b,a) tylko, gdy a jest nwp Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 8

6.6. Testowalność wejście Program wyjście Stan wewnętrzny wyrocznia {dobre, złe} Rys. 2. Testowanie i wyznaczanie testowalności [A.Bertolino,L.Strigini:On the Use of Testability Assessment,IEEE TRANSACTION ON SOFTWARE ENGINEERING,vol. 22, no. 2, February 1996] Wyrocznia jest następującą funkcją: Wyrocznia: D R (zbiór_wartości_stanów_programu ) {dobry, zły} gdzie D - dziedzina danych wejściowych, R - dziedzina danych wyjściowych zbiór_wartości_stanów_programu zbiór obserwowanych wartości zmiennych 1) Testowalność oprogramowania Testab ABS jest prawdopodobieństwem warunkowym, że wynik testu programu dla wejścia określonego prawdopodobieństwem dystrybucji wejść jest zły (określony przez funkcję wyroczni), pod warunkiem, że wystąpiły błędy w programie. Testab ABS =P( zły prawd. dystrybucji wejść, wyrocznia, błędy) 2) Testowalność oprogramowania Testab HV jest prawdopodobieństwem, że program jest uszkodzony (błędnie wykonany) dla danego prawdopodobieństwa dystrybucji wejść, pod warunkiem że wystąpiły błędy w programie. Testab HV =P( uszkodzony prawd. dystrybucji wejść, błędy) Zależność między definicjami jest następująca: Testab ABS = Testab HV P(uszkodzony Pokrycie bledny stan programu gdzie Pokrycie jest prawdopodobieństwem, że wynik wyroczni będzie zły dla danego prawdopodobieństwa dystrybucji wejść, gdy wystąpił błędny stan programu. Pokrycie = P( zły prawd. dystrybucji wejść, bledny stan programu ) bledny stan programu: błędy w obserwowanych zmiennych 4) Związek między testowaniem (liczbą przeprowadzonych testów) i niezawodnością Niezawodność programu jest częstotliwością jego błędnych wykonań. Rośnie ona logarytmicznie w zależności od liczby przeprowadzonych testów. Niezawodność = Niezawodność_poczatkowa exp (-C Liczba_testów) ) Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 9

6.7. Ocena liczby błędów metodą posiewania błędów Na podstawie wszystkich znalezionych błędów oraz błędów sztucznie wprowadzonych do programu można oszacować liczbę błędów w programie. N - liczba wprowadzonych błędów M - liczba wszystkich wykrytych błędów X - liczba wprowadzonych błędów, które zostały wykryte Szacunkowa liczba błędów przez wykonaniem testów: Błędy calk = ( M X) N X Liczba błędów po usunięciu wykrytych, w tym wszystkich sztucznie wprowadzonych: N Bł ędy Poz = ( M X ) ( 1) X Współczynnik X/N opisuje efektywność wykonywanych testów.. Metody posiewania błędów: losowe zakłócenia w przypisywaniu danych losowe mutacje kodu - zmiany kodu źródłowego zmieniającego sterowanie lub dane w programie losowe zakłócenia między interfejsami modułów Zofia Kruczkiewicz, Języki programowania 1 (Testowanie programów) str. 10