żeby sprawdzić czy algorytm działa dobrze muszę wiedzieć co ma zwrócić dla danych testowych. Jeśli mam wynik "policzyć" na piechotę na kartce to na ch** mi takie testy - ile jestem podać danych przykładowych i obliczyć dla nich wynika?
Test jest dowodem, że dla danych wejściowych funkcja zwraca poprawny wynik. Jeśli testy obejmą kilka wartości standardowych oraz warunki brzegowe, to test jest dowodem poprawności działania funkcji. Nie daje on formalnej gwarancji, ale jest wystarczająco dobry.
Bez testu nie ma żadnego dowodu, że naklepany kod w ogóle działa.
Jeśli natomiast test ma sprawdzać poprawność algorytmu na losowych danych to sam test też musi dla losowych danych policzyć jaki ma być wynik - czyli trzeba TEN SAM algorytm napisać drugi raz - próbował ktoś z Was napisać dwa kody dla tego samego algorytmu jeden po drugim lub wręcz równolegle?
No to już Twój pomysł.
Odniosę się do 2 przykładu z postu @somekind - jeśli napiszę algorytm raz, potem napiszę do niego test i wyjdzie mi że jest ok to fajnie. Zmarnowałem jakieś 1,5 raza więcej czasu niż musiałem (te 0,5 to liczenie dla przykładowych danych wejściowych co ma być na wyjściu lub pisanie drugi raz algorytmu (btw. pisze się też testy do testów??)).
Uważasz, że wielokrotne uruchamianie aplikacji, logowanie się do niej, wybranie formularza w menu, i wypełnienie w nim kilkudziesięciu pól jest szybsze niż napisanie testów?
Teraz wg @Zellus "Bardziej przydają się, gdy chcesz dodać nową funkcjonalność, a starej nie zepsuć" nie wiem co bym musiał robić w innym miejscu kodu aby zepsuł mi się moduł wyliczający rabaty. Jeśli natomiast "pogrzebię" wewnątrz tego modułu to będę miał ku temu powód - albo zmieni się sposób naliczania rabatu albo został znaleziony błąd. W pierwszym wypadku testy trzeba i tak napisać od nowa w drugim widać gdzie sobie można takie testy wsadzić.
No, jeśli dla Ciebie aplikacja to zestaw oddzielnych modułów, to może tak. Zazwyczaj jednak aplikacje dzielą między sobą jakąś część logiki. I wystarczy, że np. dodawanie nowej funkcji w module A wymaga zmiany logiki we wspólnym repozytorium albo kodzie mapującym encje na DTO, albo jakimkolwiek helperze. Taka zmiana może spowodować błędne zachowanie innych modułów aplikacji. Jeśli mamy testy jednostkowe, to szybko się o tym dowiemy. Jeśli nie, to wykryją to dopiero testerzy, albo użytkownicy.
Problem taki oczywiście nie dotyczy aplikacji powstających metodą kopiuj-wklej, bo tam nie ma żadnego kodu wspólnego. Ale jak ktoś próbował kiedyś pisać sensownie zaprojektowaną aplikację, to się z tym zetknął.
Inny przykład - upgrade wersji jakiejś biblioteki używanej przez aplikację, w nowej wersji jest błąd. W przypadku braku testów nieprędko się o tym dowiemy.
proszę Cię zatem podaj jeden konkretny z aplikacji, którą np. teraz piszesz. Jakiś najprostszy
Przykłady, które podałem odnoszą się rzeczywistej aplikacji, którą tworzę w pracy. Nie mogę wkleić jej kodu tutaj, ale wkleję za to z jednego swojego starego projektu:
Kopiuj
[TestFixture]
public class ObjectHelperTests
{
internal sealed class TestViewModel
{
[Display(Name = "Tytuł", Description = "Coś jakiegoś")]
public string Title { get; set; }
[Display(Name = "Typ", Description = "Coś")]
public string TypeName { get; set; }
public string SuperMethod(int x, string y, double z)
{
return null;
}
}
[Test]
public void Test__GetPropertyAttributeValues__Working()
{
var name = ObjectHelper.GetPropertyAttributeValue<TestViewModel, DisplayAttribute, string>(x => x.Title, a => a.Name);
var description = ObjectHelper.GetPropertyAttributeValue<TestViewModel, DisplayAttribute, string>(x => x.TypeName, a => a.Description);
Assert.That(name, Is.EqualTo("Tytuł"));
Assert.That(description, Is.EqualTo("Coś"));
}
}
Kopiuj
[Test]
public void GetAll__SortByPaymentInfoState__Success()
{
var searchSettings = GetSearchSettings();
var request = new GridDataRequest<VisitGridModel>(1, 8, new SortSettings<VisitGridModel>(x => x.PaymentInfoState, SortMode.Descending), searchSettings);
var listViewModel = this.service.GetAll(request);
Assert.That(listViewModel.Items.Count(), Is.EqualTo(8));
}
[Test]
public void GetAll__SortByPatientFirstName__Success()
{
var searchSettings = GetSearchSettings();
var request = new GridDataRequest<VisitGridModel>(1, 8, new SortSettings<VisitGridModel>(x => x.PatientFirstName, SortMode.Descending), searchSettings);
var listViewModel = this.service.GetAll(request);
Assert.That(listViewModel.Items.Count(), Is.EqualTo(8));
}
abrakadaberassertEqual(M.mappend(M.mzero, a), a)
abrakadaberM.mappend(M.mzero, a), a
to jest normalnie występujący w aplikacji kod a nie żadne metody, które coś mają zrobić naa
tylko i wyłącznie do celów przeprowadzania testów...to jest normalnie występujący w aplikacji kod
, Tak.