Odpalanie klasyNiskopoziomowe, wewnętrzne klasy logiki mają tę wadę (jeśli można to tak nazwać...), iż są właśnie niskopoziomowe i wewnętrzne - a przez to trudne do testowania w powiązaniu z całą aplikacją. Między nimi a interfejsem może znajdować się wiele warstw, które utrudniają debugowanie.
To sprawia, że przydatne stają się testy jednostkowe (unit tests). Do ich tworzenia i uruchamiania potrzeba jednak odpowiednich frameworków. Na szczęście te są już dostępne dla niemal każdego sensownego języka programowania i nierzadko są wręcz częścią jego lub jego środowiska.
Nie zawsze jednak tak było. Alternatywą dla ręcznego tworzenia specjalnych aplikacji przeznaczonych wyłącznie do testowania klas były (i właściwie nadal są) interesujące mechanizmy "uruchamiania klas" jako takich, które oferują niektóre języki programowania.
Dotyczy to przede wszystkim - jeśli nie wyłącznie - tych spośród nich, w których koncepcja programu czy aplikacji nie jest wyraźnie zakreślona. Coś jakiego jak entry point ("punkt wejścia"), od którego zaczyna się wykonywanie kodu, musi jednak istnieć i trzeba mieć jakiś sposób na jego określenie. Jeżeli zamiast aplikacji mamy tylko mniej lub bardziej luźny zbiór klas, to siłą rzeczy musi się on znajdować w którejś z nich.
A jeśli znajduje się w jednej, to czemu nie dodać go też do innych - także tych, które z założenia nie mają pojęcia o interakcji z użytkownikiem? Tworzymy w ten sposób pewnego rodzaju back-end, a owe dodatkowe punkty wejścia mogą posłużyć do testów. Oto prosty przykład w języku Java:
// testowy punkt wejścia
public static void main(String[] args) {
int n = args.length> 1 ? Integer.parseInt(args[1]) : 100;
Sumator s = new Sumator();
for (int i = 1; i <= n; ++i) s.add(i);
System.out.println ("Spodziewana suma: " + (n * (n + 1) / 2));
System.out.println ("Otrzymana suma: " + s.getSum());
}
}
Statyczna metoda main to w Javie sposób na określenie punktu wejścia. Typowym miejscem dla niego jest główna klasa aplikacji, względnie całkiem osobna klasa przeznaczona do zarządzania samym uruchamianiem programu. Tutaj umieszczamy metodę main w klasie logiki (bardzo zaawansowanej zresztą ;-]), przez co możemy "odpalić" samą tę klasę i wykonać jakiś kod testujący jej funkcjonalność.
Z popularnych języków mających taki feature można jeszcze wspomnieć Pythona. W nim obiektowość nie jest obowiązkowa, więc to skrypt (plik .py) jest podstawową jednostką kodu, którą można uruchamiać:
class Sumator:
def __init__(self): self.sum = 0
def add(self, x): self.sum += x
if __name__ == "__main__":
n = int(sys.argv[1]) if len(sys.argv)> 1 else 100
s = Sumator()
for i in range(1, n+1): s.add(i)
print "Spodziewana suma: ", (n * (n + 1) / 2)
print "Otrzymana suma: ", s.sum
Daje się w nim też umieścić "swobodny" kod, co na pierwszy rzut oka wydaje się dobrym miejscem na instrukcje testowe. Trzeba tylko otoczyć je pokazanym wyżej ifem, aby były one uruchamiane wyłącznie przy wywoływaniu skryptu z wiersza poleceń, nie zaś przy imporcie zawartego w nim kodu (instrukcją import).
Newline tags are added automatically.
For code, use [code][/code]. You can also insert LaTeX formulae inside [tex][/tex].
HTML tags allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>