Testowanie kodu gry w języku C++ za pomocą CPPUnit

Wielkość: px
Rozpocząć pokaz od strony:

Download "Testowanie kodu gry w języku C++ za pomocą CPPUnit"

Transkrypt

1 Testowanie kodu gry w języku C++ za pomocą CPPUnit Wojciech Toman

2 TESTOWANIE KODU GRY W JĘZYKU C++ ZA POMOCĄ CPPUNIT Jest duża różnica między kodem źródłowym, poprawnym kodem źródłowym i dobrym kodem źródłowym WSTĘP Błędy były, są i będą nieodłączną częścią programistycznego rzemiosła. Pojawiają się często w najmniej oczekiwanych momentach i w najmniej oczekiwanych miejscach kodu, przyczyniając się tym samym do frustracji zarówno końcowych użytkowników jak i próbujących je zlikwidować programistów i testerów. Idealnej recepty na ich eliminację nie ma i nigdy nie będzie. Istnieją jednak sposoby minimalizacji ryzyka ich wystąpienia, ograniczenia ich do takiego poziomu, że można je zaakceptować. Jedną z popularniejszych metod na przestrzeni ostatnich kilku lat są zautomatyzowane testy, a szczególnie tzw. unit-testy i testy funkcjonalne, które stanowią ważną część metodyk Agile 1. W tym artykule skupię się na tych pierwszych. Definicja 1 Test funkcjonalny (ang. functional test) test sprawdzający poprawność działania komponentów lub modułów aplikacji w rzeczywistej sytuacji oraz ich wzajemną współpracę. Przykładem testu funkcjonalnego może być sprawdzenie poprawności grafu sceny po dodaniu do niego nowego węzła za pomocą menedżera sceny. Unit-testy są testami sprawdzającymi poprawność działania kodu na poziomie najmniejszych jego autonomicznych jednostek, czyli pojedynczych funkcji 2, tu całkowicie wyrwanych z rzeczywistego kontekstu, w jakim zostaną użyte. Polegają one na przekazaniu do funkcji pewnego wejścia i przeanalizowaniu wyjścia. Wejście nie jest oczywiście przypadkowe bardzo często reprezentuje ono typową sytuację z jaką spotkamy się w grze. Jednak równie często (a nawet częściej) testowana jest sytuacja nietypowa, błędna taka jak np. zaalokowanie zbyt dużego bloku pamięci przez menedżera pamięci, czy próba otworzenia niepoprawnie zapisanego pliku poziomu. W takiej sytuacji nasz kod nadal powinien się zachowywać poprawnie: rzucając wyjątek, zgłaszając komunikat o błędzie, przyjmując wartości domyślne i ignorując nietypową sytuację lub w jeszcze inny sposób obsłużyć napotkany błąd. Definicja 2 Unit-testy są testami sprawdzającymi poprawność działania kodu na poziomie najmniejszych jego autonomicznych jednostek, czyli pojedynczych funkcji. Jeśli wyjście jest zgodne z oczekiwanym w danym przypadku wynikiem test zostaje zaliczony. W przeciwnym razie gratulacje! Właśnie znalazłeś błąd w swoim kodzie. Ważne jest to, że pojedynczy test wiele o poprawności kodu nam nie powie. Owszem, przekonamy się, że w danym przypadku kod działa zgodnie z oczekiwaniami. Ale jak zachowa się dla innych danych? Cóż recepta jest prosta. Należy napisać więcej testów. Ich liczba jest zależna od funkcji, którą poddajemy testowaniu. Co 1 Metodyki Agile są oparte na tzw. najlepszych praktykach tworzenia oprogramowania. Do ich upowszechnienia przyczyniło się w dużej mierze powstanie programowania ekstremalnego (XP) autorstwa Kenta Becka. Manifest metodyk Agile można znaleźć pod adresem: 2 Mimo że testy są prowadzone na poziomie funkcji różna jest definicja jednostki w zależności od przyjętego paradygmatu programowania. W programowaniu strukturalnym/proceduralnym jednostką jest funkcja, natomiast w programowaniu zorientowanym obiektowo klasa.

3 więcej czasem wcale nie trzeba pisać dziesiątek przypadków testowych wystarczy opracować kilka jak najlepszych tzn. mocno przemyślanych 3. Po pewnym czasie wyrobimy sobie swego rodzaju intuicję, dzięki czemu będziemy wiedzieli, że liczba określonych przez nas przypadków testowych w zupełności wystarczy do stwierdzenia, że kod jest poprawny. Definicja 3 Przypadek testowy (ang. test case) zbiór warunków i zmiennych pozwalający określić testującemu czy wymaganie poprawności testu zostało całkowicie lub częściowo spełnione. Przykładem przypadku testowego dla funkcji mnożenia macierzy, jest pomnożenie macierzy A przez macierz jednostkową I. Warunkiem zaliczenia testu jest otrzymanie w wyniku wywołania funkcji, macierzy A. Zaletą stosowania unit-testów jest to, że oszczędzają mnóstwo pracy zarówno programistom jak i zespołowi testującemu grę. Ten zaoszczędzony czas można wykorzystać na maksymalne dopracowanie gry pod kątem np. grywalności, efektów specjalnych, czy na podniesienie inteligencji aktorów AI. Ponadto pozwalają na przetestowanie kodu niższego poziomu, który ze względu na swój poziom komplikacji jest bardziej narażony na krytyczne dla poprawnego działania błędy (choćby wspomniane już błędy alokacji pamięci). Tego kodu testerzy w żaden sposób bezpośrednio nie sprawdzą, a zgłaszane przez nich objawy błędu wcale nie muszą doprowadzić nas do jego przyczyny. Prawdopodobnie spędzimy wiele godzin debugując kod, po czym okaże się, że błąd tkwi w zupełnie innym miejscu niż sądziliśmy. Ponadto starsze, tradycyjne metody testowania pod koniec produkcji gry sprawiały, że w przypadku znalezienia błędu na jego poprawienie było relatywnie niewiele czasu (większość zajmowała jego identyfikacja). Z wykorzystaniem unit-testów błąd jest znajdywany natychmiast. Może być też w związku z tym szybko poprawiony. Jakiś czas temu spotkałem się z zarzutem, że użycie unit-testów wymaga bardzo dużych zmian kodzie, aby wszystko co należy przetestować mogło w ogóle być przetestowane. Choć taka obawa jest uzasadniona, na szczęście nie jest to konieczne (choć i taka metoda jest jak najbardziej poprawna, a złamanie enkapsulacji faktycznie może okazać się konieczne). Możemy bowiem stworzyć framework do testów, który większość problemów pozwoli nam obejść. Stworzyć, lub jeszcze lepiej wykorzystać już istniejący. Teraz przechodzimy do bohatera tego artykułu, czyli CppUnit. Biblioteka ta, jedna z popularniejszych, powstała w oparciu o framework do testowania kodu Javy, o odkrywczej nazwie JUnit. CppUnit zaoszczędzi nam wiele pracy i ją ułatwi np. poprzez generowanie przejrzystych raportów z testów, z których szybko dowiemy się które testy nie zostały zaliczone, i w którym ich miejscu otrzymany wynik był niepoprawny. Korzystając z niego w najgorszym przypadku w niektórych klasach będziemy musieli dodać deklarację przyjaźni z klasą testu (o tym w dalszej części). Ma jednak jedną wadę - kompilacja jego niektórych części w darmowym VC++ Express może być problematyczna część projektów z solucji wymaga, bowiem do kompilacji bibliotek MFC i ATL, które są dostępne wyłącznie w wersjach od Professional włącznie. Na szczęście nie dotyczy to najważniejszych komponentów biblioteki, czyli tych odpowiedzialnych za tworzenie testów i ich uruchamianie. W dalszej części artykułu przedstawię proces tworzenia testów dla konkretnych klas gry i jej silnika. Jako zwolennik test-driven development uważam, że unit-testy powinny być tworzone przed napisaniem właściwego 3 Przykładowo zamiast dla funkcji sinus testować poprawność wyniku dla wartości kąta równej 45,567 stopni lepiej sprawdzić czy wartość będzie poprawna dla popularnych kątów lub upewnić się, że zawsze będzie należała do przedziału <-1; 1>.

4 kodu 4, listingi z samego kodu gry zostały pominięte, a wszelkie wątpliwości staram się wyjaśniać na bieżąco, m.in. w komentarzach do poszczególnych testów. W końcowej części artykułu postaram się przedstawić także garść porad dotyczących procesu testowania. Ponadto fakt, że przedstawiam tu konkretny framework, nie powoduje, że przedstawione techniki nie mogą być zastosowane w wypadku korzystania z innych rozwiązań. Większość z nich jest bowiem uniwersalna jedynie kod będzie wyglądał nieco inaczej. JAK ORGANIZOWAĆ TESTY Dobrą praktyką jest oddzielenie testów od kodu gry. Jest to o tyle dobre rozwiązanie, że jeśli tworzymy np. silnik graficzny, to prawdopodobnie nie mamy ochoty, udostępniać nikomu tego nadmiarowego kodu. Jeśli tworzymy grę nie mamy z kolei raczej ochoty na zbyt duże zwiększenie rozmiaru pliku wynikowego. Jednak najważniejsze jest to, że dzięki takiemu podejściu nie zmniejszamy czytelności kodu. Jeśli testujemy pewną klasę lub pewną konkretną funkcjonalność najlepiej wydzielić ze wszystkich przypadków testowych jej dotyczących osobną klasę 5. Idąc jeszcze dalej wszystkie testy można umieścić w osobnym projekcie. Taką klasę będącą zbiorem testów dotyczących pewnej funkcjonalności nazwiemy z języka angielskiego test suit. Definicja 4 Zbiór testów (ang. test suite) zbiór przypadków testowych sprawdzających poprawność konkretnego fragmentu funkcjonalności. W przypadku programowania zorientowanego obiektowo, zbiór testów będzie zwykle dotyczył jednej klasy. Ważne jest, aby testy uruchamiać dla każdej z konfiguracji. Może się bowiem okazać, że test zaliczony w konfiguracji Debug nie zostanie zaliczony w konfiguracji Release. Dlaczego? Z taką sytuacją wiąże się ściśle pojęcie heisenbug. Ogólnie mówiąc: po pierwsze w konfiguracji Debug do kodu jest dołączonych znacznie więcej informacji (które sprawiają, że niepoprawny kod może zachowywać się przez długi czas w porządku), a ponadto niektóre z optymalizacji z Release uwidaczniają nasze błędy. Definicja 5 Heisenbug (za Wikipedia) - błąd systemu, który wymyka się próbom wyizolowania warunków jego występowania, np. nie występuje lub zmienia swoje zachowanie w trakcie próby powtórzenia go w tych samych warunkach. Wspomniałem wcześniej o tym, że być może koniecznym stanie się złamanie enkapsulacji. W świetle tego, co przeczytałeś w tym podrozdziale powinno być już jasne dlaczego. Testy będą się odwoływać do metod testowanych obiektów. Zatem jedynym sposobem dostępu do metod prywatnych i chronionych jest zmiana ich zasięgu na publiczny bądź deklaracja przyjaźni z klasą testu. To drugie rozwiązanie wydaje się być bardziej eleganckie jednak wybór należy do Ciebie. PISZEMY TESTY 4 Takie podejście wywodzi się z tzw. Agile Methods [Toman01]. Powoduje ono, że programista znacznie dogłębniej zastanawia się nad kodem, który napisze, co przyczynia się do wzrostu jego jakości. 5 W CppUnit taka klasa nazywa się TestFixture niestety nie istnieje dobry polski odpowiednik dla tej nazwy.

5 W ramach tego rozdziału zajmiemy się następującymi klasami: klasą macierzy o wymiarach 4x4 o nazwie Matrix4 oraz klasą poziomu gry GameLevel. Dla każdej z nich określimy podstawową funkcjonalność, a następnie na tej podstawie stworzymy kilka przypadków testowych. Najpierw jednak przyjrzymy się, jak pisać testy przy pomocy CppUnit. Celem jest pokazanie praktycznego zastosowania unit-testów. JAK PISAĆ TESTY PRZY POMOCY CPPUNIT Oczywistym jest, że testy przy wykorzystaniu biblioteki CppUnit należy pisać w sposób z nią zgodny. W zasadzie są dwie metody, które różnią się zasadniczo ilością makr stosowanych w kodzie. Pierwsza z nich przedstawiona m.in. w [Madden01] prezentuje się w poniższy sposób: Listing 1 #include <cppunit/testfixture.h> #include <cppunit/testsuite.h> #include <cppunit/test.h> #include <cppunit/testcaller.h> #include <cppunit/testassert.h> class TestsMath: public CppUnit::TestFixture public: CPPUNIT_TEST_SUITE(TestsMaths); CPPUNIT_TEST(sineTest); CPPUNIT_TEST(cosineTest); CPPUNIT_TEST_SUITE_END(); float sinetest() float cosinetest() ; Zatrzymajmy się na chwilę w tym miejscu i przeanalizujmy powyższą definicję klasy TestsMaths. Jej przeznaczeniem jest przetestowanie funkcji matematycznych w naszej bibliotece. Aby klasa ta w ogóle mogła być potraktowana jako zbiór testów musi być dziedziczona z klasy TestFixture z biblioteki CppUnit 6. Makra CPPUNIT_TEST_SUITE i CPPUNIT_TEST_SUITE_END określają początek i koniec zbioru funkcji, opisujących przypadki testowe. Jedna uwaga odnośnie CPPUNIT_TEST_SUITE. Wyrażenie podane w nawiasie musi być nazwą typu dziedziczącego z TestFixture (prawdopodobnie będziesz chciał w tym miejscu umieścić nazwę klasy, którą właśnie definiujesz). 6 Możliwe jest też dziedziczenie z klasy Test będącej pojedynczym przypadkiem testowym. Aby skorzystać z tej metody należy później przeciążyć funkcję runtest() i umieścić w niej przypadek testowy.

6 Oprócz powyższego zapisu istnieje równoważny, w którym po prostu liczba makr została znacznie ograniczona: Listing 2 #include <cppunit/testfixture.h> #include <cppunit/testsuite.h> #include <cppunit/test.h> #include <cppunit/testcaller.h> #include <cppunit/testassert.h> class TestsMath: public CppUnit::TestFixture public: static CppUnit::Test* suite() CppUnit::TestSuite* suiteoftests = new CppUnit::TestSuite( TestsMaths ); CppUnit::TestCaller<TestsMaths>( sinetest, &TestsMaths::sineTest)); CppUnit::TestCaller<TestsMaths>( cosinetest, &TestsMaths::cosineTest)); return suiteoftests; float sinetest() ; float cosinetest() Jak widać największą różnicą w porównaniu do poprzedniego listing, jest rezygnacja z makr i dodanie statycznej metody o nazwie suite() zwracającej wskaźnik do obiektu Test. W jej ciele dodawane są wszystkie testy, poprzez utworzenie obiektu typu TestSuite i wywołanie na nim metody addtest(). Gdy teraz mamy już określone przypadki testowe, zobaczymy jak możemy określić czy dany test został zaliczony, czy też nie. Z pomocą przychodzi kilka użytecznych makr: CPPUNIT_ASSERT(warunek) tego makra będziesz prawdopodobnie używać najczęściej. Działa podobnie jak tradycyjne makro assert znane programistom C++. Jeśli warunek nie został spełniony, test zostaje nie zaliczony. CPPUNIT_ASSERT_MESSAGE(komunikat, warunek) podobnie jak powyższe, tyle że pozwala na określenie własnego komunikatu w przypadku niepowodzenia. CPPUNIT_ASSERT_THROW(wyrażenie, wyjątek) test zostaje zaliczony jeśli dla danego wyrażenia zostanie rzucony konkretny wyjątek. Makro to jest niezwykle przydatne do testowania nietypowych sytuacji. Ponadto biblioteka CppUnit definiuje takie makra jak: CPPUNIT_FAIL, CPPUNIT_ASSERT_EQUAL czy CPPUNIT_ASSERT_DOUBLES_EQUAL. Jednak ich praktyczne zastosowanie jest niewielkie. Zwykle będziesz się

7 prawdopodobnie ograniczać do CPPUNIT_ASSERT i CPPUNIT_ASSERT_THROW, gdyż wszystkie warunki są możliwe do określenia przy ich pomocy. Na koniec warto wspomnieć o dwóch funkcjach klasy TestFixture: setup() i teardown(). Pierwsza dokonuje inicjalizacji obiektów, z których będziemy korzystać w przypadkach testowych, a druga je zwalnia. Aby z nich skorzystać wystarczy je przeciążyć w swojej klasie. W kolejnych podrozdziałach tego artykułu zajmiemy się napisaniem prawdziwych testów. KLASA MATRIX4 Najpierw zastanówmy się, jaką funkcjonalność powinna zapewniać klasa macierzy. Ułatwi nam to jej gruntowne przetestowanie. Powinna pozwalać na: Tworzenie macierzy z tablicy 16 liczb zmiennoprzecinkowych dobrym testem czy macierz jest tworzona poprawnie jest podanie na wejściu 16 różnych liczb i sprawdzeniu, czy pojawiają się one w tych komórkach macierzy, do których mieliśmy je zamiar zapisać. Wystarczy jeden przypadek testowy, gdyż nie ma tu sytuacji nadzwyczajnych. Dodawanie macierzy w zasadzie jak wyżej, wystarczy sprawić, aby w każdej komórce macierzy wynikowej była inna wartość. Mnożenie macierzy o ile w zwykłym przypadku funkcja ta nie stanowi większego problemu, to już przy dodaniu optymalizacji pod SSE lub SSE2 jest możliwość, że błąd się pojawi. Poza mnożeniem dwóch dowolnych macierzy należy sprawdzić jak zachowa się mnożenie macierzy przez jej macierz odwrotną (powinno w wyniku dać macierz jednostkową) oraz przez macierz jednostkową (powinno dać macierz wejściową). Transponowanie macierzy Odwracanie macierzy należy sprawdzić jak zachowa się macierz, której wyznacznik jest równy 0 (macierz odwrotna wówczas nie istnieje). Liczenie wyznacznika Najpierw napiszmy definicję klasy TestMatrix4 dziedziczącej z CppUnit::TestFixture.

8 Listing 3 class TestMatrix4: public CppUnit::TestFixture public: TestMatrix4() ~TestMatrix4() void testcreation(); void testinvert(); void testdeterminant(); void testtranspose(); void testaddition(); void testmultiplication(); ; static CppUnit::Test* suite(); Poniżej natomiast znajduje się implementacja poszczególnych metod tej klasy. Wszystkie kroki staram się wytłumaczyć w komentarzach w kodzie: Listing 4 CppUnit::Test* TestMatrix4::suite() CppUnit::TestSuite* suiteoftests = new CppUnit::TestSuite( TestMatrix4 ); // Kolejno dodajemy wszystkie testy do zbioru testów. // W tym celu tworzymy nowy obiekt szablonowy TestCaller, // którego konstruktor przyjmuje za argumenty nazwę testu // oraz wskaźnik na funkcję będąca przypadkiem testowym CppUnit::TestCaller<TestMatrix4>( testcreation, &TestMatrix4::testCreation)); CppUnit::TestCaller<TestMatrix4>( testinvert, &TestMatrix4::testInvert)); CppUnit::TestCaller<TestMatrix4>( testdeterminant, &TestMatrix4::testDeterminant)); CppUnit::TestCaller<TestMatrix4>( testtranspose, &TestMatrix4::testTranspose)); CppUnit::TestCaller<TestMatrix4>( testaddition, &TestMatrix4::testAddition)); CppUnit::TestCaller<TestMatrix4>( testmultiplication, &TestMatrix4::testMultiplication)); return suiteoftests; void TestMatrix4::testCreation() // Niezwykle prosty przypadek testowy. Tworzymy macierz 4x4 typu // Matrix4, która w konstruktorze przyjmuje 16 liczb typu zmienno- // przecinkowego. Wystarczy zatem sprawdzić, czy wszystkie liczby // zostały wpisane we właściwych miejscach.

9 // W ten sam sposób można sprawdzić np. tworzenie macierzy // jednostkowej (wywołanie metody o nazwie identity() i sprawdzenie // zawartości poszczególnych pól macierzy). Matrix4 mat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); CPPUNIT_ASSERT(mat._m11 == 1 && mat._m12 == 2 && mat._m13 == 3 && mat._m14 == 4 && mat._m21 == 5 && mat._m22 == 6 && mat._m23 == 7 && mat._m24 == 8 && mat._m31 == 9 && mat._m32 ==10 && mat._m33 ==11 && mat._m34 ==12 && mat._m41 ==13 && mat._m42 ==14 && mat._m43 ==15 && mat._m44 ==16); void TestMatrix4::testAddition() // Kolejny prosty test. Wystarczy dodać dwie macierze w taki sposób, // aby żadna wartość nie występowała w komórkach macierzy wynikowej // więcej niż raz. Matrix4 mat1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); Matrix4 mat2(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); mat0 = add(mat1, mat2); // Zwróćmy uwagę na to, że tym razem nie podajemy tu konkretnej // macierzy, a wynik jej pomnożenia przez liczbę 2. Oczywiście // użycie takiej formy wymaga najpierw sprawdzenia poprawności // mnożenia macierzy przez liczbę rzeczywistą, jednak w tym artykule // test ten pomijamy. Sam fakt zastosowania tego typu sprawdzenia // wynika z faktu, że macierze wejściowe są sobie równe. CPPUNIT_ASSERT(mat0 == 2 * mat1); // Poniżej sprawdzamy inne sposoby wykonywania dodawania macierzy, // tj. Z wykorzystaniem przeciążonych operatorów. mat0 = mat1; mat0 += mat1; CPPUNIT_ASSERT(mat0 == 2 * mat1); mat0 = mat1 + mat2; CPPUNIT_ASSERT(mat0 == 2 * mat1); void TestMatrix4::testMultiplication() Matrix4 mat1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); Matrix4 mat2; Matrix4 mat0; // Pomnożenie dowolnej macierzy przez macierz jednostkową powinno // zwrócić macierz wejściową. mat2.identity(); mat0 = mat1; mat0.multiply(mat2); CPPUNIT_ASSERT(mat0 == mat1); // Pomnożenie macierzy jednostkowej przez dowolną macierz powinno // zwrócić tę macierz. mat0 = mat2; mat0.multiply(mat1); CPPUNIT_ASSERT(mat0 == mat1); // Pomnożenie dowolnej macierzy przez jej macierz odwrotną powinno // zwrócić macierz jednostkową (przy założeniu, że macierz odwrotna // istnieje).

10 mat0 = mat1; mat2 = invert(mat1); mat0.multiply(mat2); CPPUNIT_ASSERT(mat0.isIdentity()); void TestMatrix4::testInvert() // Odwracamy macierze, które są odwracalne. Matrix4 mat(1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1); mat.invert(); CPPUNIT_ASSERT(mat == Matrix4(0.25, 0.25, 0.25, 0.25, 0.25, 0.25,-0.25,-0.25, 0.25,-0.25, 0.25,-0.25, 0.25,-0.25,-0.25, 0.25)); mat.set(1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1); mat.invert(); CPPUNIT_ASSERT(mat == Matrix4(1, 0, 0, 0, 1, 1, 1, -1, -1, -1, 0, 1, 0, 1, 0, 0)); // Sprawdzamy co się dzieje gdy macierz ma wyznacznik równy 0. // Przyjmijmy, że w wyniku tej operacji chcemy otrzymać macierz // wejściową. Matrix4 mat2(0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); mat = mat2; mat.invert(); CPPUNIT_ASSERT(mat == mat2); void TestMatrix4::testDeterminant() // Sprawdzamy poprawność liczenia wyznacznika. Matrix4 mat(2, -2, 0, 1, 0, -1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 1); CPPUNIT_ASSERT(mat.determinant() == -6); mat.set(1, -2, 0, 1, 0, 0, 0, 2, -1, 0, 3, 0, 0, -1, 2, 0); CPPUNIT_ASSERT(mat.determinant() == -2); mat.set(0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); CPPUNIT_ASSERT(mat.determinant() == 0); void TestMatrix4::testTranspose() Matrix4 mat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); mat.transpose(); CPPUNIT_ASSERT(mat == Matrix4(1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16)); To tyle na temat klasy macierzy. Oczywiście napisanie większej liczby testów może być uzasadnione, jednak na potrzeby tego artykułu te w zupełności wystarczą.

11 KLASA GAMELEVEL Klasa GameLevel będzie pozwalała na wczytywanie pliku poziomu zapisanego w formacie XML. W związku z tym większość testów powinna oscylować wokół sprawdzenia poprawności danych w nim zawartych. Sprawdzenia, czy tagi mają dopuszczalne wartości. Należy też przetestować co się stanie, gdy w pliku zabraknie krytycznych danych, takich jak np. dane o wersji pliku bądź pojawią się dane, z których nie korzystamy. Oczywiście można by powiedzieć, że takie testy nie mają sensu, gdyż zwykle do tworzenia poziomów wykorzystuje się i tak edytor, który zapisuje dane w odpowiednim formacie. Pojawia się jednak pewne ale: 1. Na początku produkcji prawdopodobnie edytor będzie w tak mało zaawansowanej wersji, że wiele osób będzie edytować plik ręcznie, w edytorze tekstu byle tylko móc stworzyć prototypy. O pomyłkę wówczas nietrudno, a szukanie buga, którego w rzeczywistości nie ma (wina leży tu po stronie nieuważnego użytkownika) jest na pewno niewdzięcznym i czasochłonnym zadaniem. 2. Edytor sam w sobie może zawierać błędy. Oczywiście jeśli to my za niego odpowiadamy powinniśmy go, w myśl tego artykułu, gruntownie przetestować. Zdarza się jednak, że wykorzystuje się gotowe narzędzia, których kodu przetestować nie możemy. Jeśli zawierają one jakiś błąd możemy się tylko przed nim zabezpieczyć. Zresztą nawet jeśli edytor jest autorstwa członka naszego zespołu to o ile nie jesteśmy w jego kierownictwie nie zmusimy nikogo do pisania unit-testów. Poniżej znajduje się definicja przypadków testowych dla klasy GameLevel. W tym przypadku nie umieszczam już definicji samej klasy, ani definicji metody suite(). Ponadto przedstawiam tylko testy dla funkcji wczytujących poziom. W innym przypadku ten artykuł musiałby być dużo dłuższy. Listing 5 void TestGameLevel::testCreation() // Na początek sprawdzamy, czy poziom jest wczytywany poprawnie, gdy // wczytujemy plik o poprawnym nagłówku: // autor, nazwa, wersja, plik do wczytania. // Oczekujemy, że sprawdzenie poprawności (metoda isvalid()) da // wartość pozytywną (true). LevelHeader header( author, level, 1.1, level.lvl ); GameLevel level; level.load(header); CPPUNIT_ASSERT(level.isValid()); CPPUNIT_ASSERT(level.getAuthor() == author ); CPPUNIT_ASSERT(level.getName() == level ); CPPUNIT_ASSERT(level.getVersion() == 1.1); CPPUNIT_ASSERT(level.getFileName() == level.lvl ); // Teraz sprawdzamy co się stanie, gdy w nagłówku zabraknie danych // opcjonalnych: autor i wersja. Oczekujemy, że zostaną zastosowane // wartości domyślne. LevelHeader header2; header2.name = level ; header2.file = level.lvl ; level.load(header2); CPPUNIT_ASSERT(level.isValid()); CPPUNIT_ASSERT(level.getAuthor() == DEFAULT_AUTHOR); CPPUNIT_ASSERT(level.getVersion() == DEFAULT_VERSION); CPPUNIT_ASSERT(level.getVersion() == 1.1);

12 CPPUNIT_ASSERT(level.getFileName() == level.lvl ); // Gdy nie zostaną podane wartości wymagane, poziom powinien mieć // status: nieprawidłowy funkcja isvalid() zwróci wartość false. LevelHeader header3; header3.author = author ; header3.name = level ; header3.version = 1.1; level.load(header3); CPPUNIT_ASSERT(level.isValid() == false); // Alteratywą dla powyższego rozwiązania będzie sprawdzenie rzucenia // wyjątku, typu Invalid_Header: // CPPUNIT_ASSERT_THROW(level.load(header3), Invalid_Header); URUCHAMIANIE TESTÓW Zatem mamy już napisane kilka testów, ale kompilacja źródeł nie powoduje wcale, że otrzymujemy ich wyniki. Nadal nie wiemy, które z nich zaliczyły, a które nie. Cała nasza praca poszła na marne? Na szczęście nie, ale faktycznie aby je zobaczyć należy najpierw testy uruchomić. Za uruchamianie testów są odpowiedzialne obiekty klasy TestRunner. Przed uruchomieniem testów należy je dodać wywołując metodę TestRunner::addTest(). Metoda ta przyjmuje za argument wskaźnik na obiekt typu Test (przypominam, że metoda suite() zwraca taki wskaźnik). Po dodaniu wszystkich testów wystarczy wywołać metodę TestRunner::run() i wszystko się wyjaśni. Poniżej znajduje się kod dla naszej sytuacji: Listing 6 int main() CppUnit::TextUi::TestRunner runner; runner.addtest(testgamelevel::suite()); runner.addtest(testmatrix4::suite()); runner.run(); RAPORTY Niezwykle przydatną cechą biblioteki CppUnit jest to, że pozwala ona na generowanie czytelnych raportów z przeprowadzonych testów. Wyczytamy z nich ile testów zostało przeprowadzonych, które nie zaliczyły, w którym miejscu testu wystąpił błąd. Najczytelniejszym wg mnie jest arkusz xmla. Za to w jaki sposób zostanie przedstawiony raport z testów odpowiada obiekt klasy Outputter (dla xml a będzie to XmlOutputter), któremu można przekazać do konstruktora strumień, do którego chcemy zapisać dane. Ustawienie danego wyjścia odbywa się poprzez wywołanie metody TextUi::TestRunner::setOutputter(). Kod w naszej sytuacji będzie wyglądał następująco: Listing 7 CppUnit::TextUi::TestRunner runner;

13 std::ofstream ofs( tests.xml ); CppUnit::XmlOutputter* xml = new CppUnit::XmlOutputter(&runner.result(), ofs); xml->setstylesheet( report.xsl ); runner.setoutputter(xml); runner.addtest(testgamelevel::suite()); runner.addtest(testmatrix4::suite()); runner.run(); W kolejnych wierszach tworzymy kolejno strumień, obiekt outputtera i przypisujemy mu wybrany arkusz styli. AUTOMATYZACJA Bardzo ważną kwestią w nowoczesnych metodach testowania kodu jest zagadnienie tzw. automatyzacji. Jakiś czas temu zauważono, że najlepiej byłoby gdyby testy uruchamiane były automatycznie co jakiś czas (np. przed umieszczeniem kodu w repozytorium SVN czy CVS, czy też raz na tydzień), dzięki czemu byłaby gwarancja, że wprowadzane zmiany nie zaburzają poprawności działania kodu. CppUnit udostępnia do tego celu odpowiednie narzędzie. Niestety należy ono do tych, których kompilacja w popularnym VC++ Express jest niemożliwa. Napisanie prostego narzędzia do tego celu choć specjalnie trudne nie jest, na pewno jest czasochłonne. Na szczęście VC++ udostępnia mechanizm Build-Events, który choć trochę może nam pomóc. W Post-Build Event dopisz: $(ConfigurationName)\Test.exe $(ConfigurationName)\tests.xml Te dwa proste wiersze spowodują, że testy zostaną uruchomione ilekroć zbudowany zostanie projekt z testami (a powinien być budowany zawsze), a do tego zostanie otwarty raport z ich działania. Proste i pożyteczne. PORADY Poniżej znajduje się kilka użytecznych rad dotyczących tworzenie unit-testów: Czego nie należy testować? o o Przede wszystkim nie należy testować kodu pochodzącego całkowicie z zewnątrz. Rozumiem przez to oczywiście wszelkie biblioteki, silniki, których nie napisaliśmy sami, a które wykorzystujemy w swojej grze. Przeważnie i tak nie mamy takiej możliwości, bo nie mamy dostępu do kodu źródłowego, ale ważniejsze jest to, że nigdy nie będziemy znali danej biblioteki tak dobrze jak jej twórcy. Zresztą z jakiego powodu mielibyśmy wyręczać w pracy innych programistów? Zwykle nie ma też potrzeby testowania akcesorów, podobnie jak nie ma ich sensu uwzględniać w diagramach UMLa. Niemniej nie jest to regułą i czasem należy postąpić inaczej. Analogiczna sytuacja występuje dla przeciążonych operatorów. Testując, należy mieć po prostu na uwadze, że błąd może się pojawić nawet w pozornie łatwej funkcji. Dobrym przykładem są tu klasy należące do bibliotek matematycznych. Prędzej czy później będziemy chcieli je pewnie zoptymalizować pod kątem SIMD. Wówczas ich kod znacznie się skomplikuje. Dzięki napisaniu testów będziemy mieli gwarancję, że ta zmiana nie zaburzy prawidłowego funkcjonowania kodu. Ponadto wykonywanie działań matematycznych np. na

14 kwaternionach jest samo w sobie na tyle skomplikowane, że nawet w nie-simdowej formie jest narażone na trudne do uchwycenia błędy. o Test nigdy nie powinien wychodzić poza obręb testowanej jednostki (funkcji/klasy). Jeśli w teście dochodzi do jakiejś interakcji z innymi jednostkami można tu już bowiem mówić o teście funkcjonalnym. Innymi słowy w podejściu obiektowym nie powinniśmy wywoływać metod należących do klas nie będących częścią zbioru testów. W podejściu strukturalnym funkcji. Unit-testy wskazują jedynie czy kod jest poprawny. Nie są jednak w żadnym stopniu zdolne udzielić nam odpowiedzi, czy ten kod jest rzeczywiście funkcjonalny czy grywalny - powiedzą nam, czy w wyniku trafienia przeciwnika odebrane zostało mu życie, ale nie powiedzą nam, czy liczba odebranych punktów życia ma jakikolwiek sens praktyczny. Unit-testy nie do tego zostały wymyślone! Wniosek stąd jest prosty nie możemy całkowicie zrezygnować z QA. Testy nie są nam też w stanie powiedzieć nic o wydajności aplikacji, ani wyłapać błędów prowadzących do jej zmniejszenia (mam tu na myśli np. wybór złego algorytmu czy struktury danych). Gdzie leży granica między unit-testami, a testami funkcjonalnymi? Zgodnie z tym co zostało powiedziane testy funkcjonalne sprawdzają poprawność oprogramowania na wyższym poziomie, na poziomie współpracy między jego poszczególnymi częściami. Teoria zatem brzmi niezwykle prosto i typowym przykładem testu funkcjonalnego może być następująca sytuacja. Tworzymy obiekt graficzny za pomocą menedżera siatek, po czym dodajemy go do grafu sceny poprzez menedżer sceny. Następnie sprawdzamy zawartość tego grafu. Jednak nie zawsze ta granica musi być tak oczywista, np. mnożenie macierzy 4x4 przez wektor 4- wymiarowy. Z jednej strony są to dwie oddzielne klasy opakowujące pewne określone operacje. Z drugiej, z logicznego punktu widzenia stanowią jeden rodzaj funkcjonalności (zwłaszcza, że wektor w algebrze liniowej jest niczym innym jak macierzą o jednym z wymiarów wynoszącym 1). Zatem tu w moim przekonaniu lepiej użyć unit-testów. Przy okazji chciałbym podkreślić, że tandem unit-testy + testy funkcjonalne jest znacznie silniejszą bronią w walce z błędami niż tylko jeden rodzaj testów! Teoretycznie często zaleca się, aby jeden przypadek testowy był jedną funkcją. Jednak od razu widać, że jeśli dla jednej tylko funkcji napiszemy kilka przypadków testowych to dla całej klasy takich funkcji może być kilkadziesiąt i więcej, co sprawia, że kod testów staje się mało przejrzysty. Warto zatem wszystkie powiązane ze sobą przypadki testowe (np. pogrupowane pod kątem funkcji, których dotyczą) umieścić razem tj. w jednej funkcji testującej. Często nie jesteśmy w stanie jednoznacznie podać rezultatu jakiego oczekujemy od funkcji, lub dopuszczamy pewien margines błędu. Taka sytuacja może mieć miejsce np. w przypadku obliczeń na liczbach zmiennoprzecinkowych, bądź wykorzystywania stablicowanych wartości dla funkcji trygonometrycznych. Opłaca się wówczas wykorzystać pewne własności funkcji i to je testować. Przykładem może być badanie wyjścia funkcji sinus. Na wejściu możemy podać losowe kąty 7 i 7 Ze stosowaniem losowych testów należy bardzo uważać, bo nie mamy nad nimi pełnej kontroli. Z jednej strony mamy znacznie więcej przypadków testowych niż określilibyśmy ręcznie. Z drugiej może się zdarzyć tak, że będą one należały do określonego przedziału, tym samym pozostawiając nieprzetestowanym inne przedziały. Jednak istnieje możliwość określenia pewnych reguł generowania przypadków testowych. Takie

15 sprawdzić czy zawsze wynik jest większy równy od -1 i mniejszy równy od 1. Dla małych kątów możemy natomiast sprawdzić czy wartość sinusa jest w przybliżeniu równa samej wartości kąta. PODSUMOWANIE Podsumowując należy jeszcze raz podkreślić, że nawet unit-testy (czy jakiekolwiek inne testy) nie uchronią cię całkowicie przed błędami. Nadal będą się one pojawiać, choć z dużym prawdopodobieństwem w znacznie mniejszych ilościach. Unit-testy mogą nam oszczędzić wielu problemów, jest to jak napisał Blake Madden automatyczny debugger, który większość pracy wykonuje za nas. Niestety, mimo ich niewątpliwych zalet mają pewne problemy, aby zagościć na poważnie w przemyśle gier wideo. Dlaczego? Nie wiem sam szukam na to pytanie odpowiedzi i jak na razie jej nie znajduję. Niemniej zachęcam wszystkich do ich testowania. Niech nasze gry mają jak najmniej błędów! I na koniec jeszcze jedno zdanie: BIBLIOGRAFIA Błędny test jest gorszy niż jego brak [CppUnit01] Dokumentacja biblioteki CppUnit, dostępna online na [Madden01] Madden Blake, Using CppUnit to Implement Unit Testing, Games Programming Gems 6, Charles River Media [Toman01] Toman Wojciech, Sport dla programistów, czyli programowanie ekstremalne, dostępny online na podejście prowadzi do jeszcze większej automatyzacji procesu testowania, przy zachowaniu przynajmniej częściowej kontroli nad postacią przypadków testowych.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji. JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Spis treści Wprowadzenie...n...n... 5 Jak korzystać z tej książki?...t... 6 Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Podsumowanie...t...t...15 Rozdział 2. Rozdział

Bardziej szczegółowo

TESTOWANIE OPROGRAMOWANIA

TESTOWANIE OPROGRAMOWANIA TESTOWANIE OPROGRAMOWANIA Uważaj na ten program ja tylko udowodniłem jego poprawność, nie testowałem go Donald Knuth Plan prezentacji 1. Testowanie wstęp 2. Refaktoryzacja 3. Pojęcia związane z testowaniem

Bardziej szczegółowo

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

REFERAT PRACY DYPLOMOWEJ

REFERAT PRACY DYPLOMOWEJ REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i implementacja środowiska do automatyzacji przeprowadzania testów aplikacji internetowych w oparciu o metodykę Behavior Driven Development. Autor: Stepowany

Bardziej szczegółowo

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8 Inżynieria Oprogramowania 2013/14 LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8 Hierarchia klas: TestCase klasa testująca, będąca klasą bazową dla wszystkich przypadków testowych. Zawiera przypadki testowe

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,

Bardziej szczegółowo

C++ - [1-3] Debugowanie w Qt Creator

C++ - [1-3] Debugowanie w Qt Creator Slajd 1 z 10 C++ - [1-3] Debugowanie w Qt Creator Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 15 maja 2013 r. Slajd 2 z 10 Pojęcia związane z debugowaniem DEBUGOWANIE (z ang. debugging odrobaczanie)

Bardziej szczegółowo

Warunek wielokrotnego wyboru switch... case

Warunek wielokrotnego wyboru switch... case Warunek wielokrotnego wyboru switch... case Działanie instrukcji switch jest zupełnie inne niż w przypadku instrukcji if o czym będziesz mógł się przekonać w niniejszym rozdziale. Różnice pomiędzy instrukcjami

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

Laboratorium 1 - Programowanie proceduralne i obiektowe

Laboratorium 1 - Programowanie proceduralne i obiektowe Laboratorium 1 - Programowanie proceduralne i obiektowe mgr inż. Kajetan Kurus 4 marca 2014 1 Podstawy teoretyczne 1. Programowanie proceduralne (powtórzenie z poprzedniego semestru) (a) Czym się charakteryzuje?

Bardziej szczegółowo

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu inż. Daniel Solarz Wydział Fizyki i Informatyki Stosowanej AGH 1. Cel projektu. Celem projektu było napisanie wtyczki

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami 1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.

Bardziej szczegółowo

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Jak napisać program obliczający pola powierzchni różnych figur płaskich? Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy

Bardziej szczegółowo

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy Programowanie w C++ 1.Czym jest programowanie Pisanie programów to wcale nie czarna magia, tylko bardzo logiczna rozmowa z komputerem. Oczywiście w jednym ze specjalnie stworzonych do tego celu języków.

Bardziej szczegółowo

I - Microsoft Visual Studio C++

I - Microsoft Visual Studio C++ I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

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

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język

Bardziej szczegółowo

Matlab, zajęcia 3. Jeszcze jeden przykład metoda eliminacji Gaussa dla macierzy 3 na 3

Matlab, zajęcia 3. Jeszcze jeden przykład metoda eliminacji Gaussa dla macierzy 3 na 3 Matlab, zajęcia 3. Pętle c.d. Przypomnijmy sobie jak działa pętla for Możemy podać normalnie w Matlabie t=cputime; for i=1:20 v(i)=i; e=cputime-t UWAGA: Taka operacja jest bardzo czasochłonna i nieoptymalna

Bardziej szczegółowo

dr inż. Ryszard Rębowski 1 WPROWADZENIE

dr inż. Ryszard Rębowski 1 WPROWADZENIE dr inż. Ryszard Rębowski 1 WPROWADZENIE Zarządzanie i Inżynieria Produkcji studia stacjonarne Konspekt do wykładu z Matematyki 1 1 Postać trygonometryczna liczby zespolonej zastosowania i przykłady 1 Wprowadzenie

Bardziej szczegółowo

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład VII - semestr III Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Wytwarzanie oprogramowania Model tworzenia oprogramowania

Bardziej szczegółowo

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja

Bardziej szczegółowo

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Pierwsze kroki Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura Co znaczy

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga! Programowanie I O czym będziemy mówili Podstawy programowania w językach proceduralnym ANSI C obiektowym Java Uwaga! podobieństwa w podstawowej strukturze składniowej (zmienne, operatory, instrukcje sterujące...)

Bardziej szczegółowo

Java jako język programowania

Java jako język programowania Java jako język programowania Interpretowany programy wykonują się na wirtualnej maszynie (JVM Java Virtual Machine) Składnia oparta o język C++ W pełni zorientowany obiektowo (wszystko jest obiektem)

Bardziej szczegółowo

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++ Jednostka prowadząca: Wydział Techniczny Kierunek studiów: Elektronika i telekomunikacja Nazwa przedmiotu: Język programowania C++ Charakter przedmiotu: podstawowy, obowiązkowy Typ studiów: inŝynierskie

Bardziej szczegółowo

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: 29.06.2015 Wersja: 1.

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: 29.06.2015 Wersja: 1. Widżety KIWIPortal tworzenie umieszczanie na stronach internetowych opcje zaawansowane Autor: Damian Rebuś Data: 29.06.2015 Wersja: 1.3 Strona 1 z 17 1 SPIS TREŚCI 2 Metody osadzania widżetów... 3 2.1

Bardziej szczegółowo

Ogólne zasady projektowania algorytmów i programowania

Ogólne zasady projektowania algorytmów i programowania Ogólne zasady projektowania algorytmów i programowania Pracuj nad właściwie sformułowanym problemem dokładna analiza nawet małego zadania może prowadzić do ogromnych korzyści praktycznych: skrócenia długości

Bardziej szczegółowo

Praktyka Programowania

Praktyka Programowania Praktyka Programowania Dariusz Dereniowski Materiały udostępnione przez Adriana Kosowskiego Katedra Algorytmów i Modelowania Systemów Politechnika Gdańska deren@eti.pg.gda.pl Gdańsk, 2010 strona przedmiotu:

Bardziej szczegółowo

QUERY język zapytań do tworzenia raportów w AS/400

QUERY język zapytań do tworzenia raportów w AS/400 QUERY język zapytań do tworzenia raportów w AS/400 Dariusz Bober Katedra Informatyki Politechniki Lubelskiej Streszczenie: W artykule przedstawiony został język QUERY, standardowe narzędzie pracy administratora

Bardziej szczegółowo

Języki programowania zasady ich tworzenia

Języki programowania zasady ich tworzenia Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie

Bardziej szczegółowo

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Komponenty i serwisy Wstęp: W trzeciej części przedstawione zostaną podstawowe techniki

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

Przypadek testowy. Teoria i praktyka

Przypadek testowy. Teoria i praktyka Magazine Przypadek testowy. Teoria i praktyka Autor: Radosław Smilgin O autorze: Radosław Smilgin jest trenerem i konsultantem z zakresu testowania oprogramowania. Materiał przedstawiony w tym artykule

Bardziej szczegółowo

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3. Maszyny stanów Programowanie gier bez Unity, cz. 3 Piotr Korgul Koło Naukowe Twórców Gier Polygon 3 grudnia 2014 r. Cykl Programowanie gier bez Unity 1 Jak zorganizować prace nad grą? 2 Jak działa gra?

Bardziej szczegółowo

Multimedia JAVA. Historia

Multimedia JAVA. Historia Multimedia JAVA mgr inż. Piotr Odya piotrod@sound.eti.pg.gda.pl Historia 1990 rozpoczęcie prac nad nowym systemem operacyjnym w firmie SUN, do jego tworzenia postanowiono wykorzystać nowy język programowania

Bardziej szczegółowo

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Zagadnienia 1. Delegaty wiązane, właściwości indeksowane 2. Delegaty niewiązane 3. Nowa wersja kalkulatora, delegaty

Bardziej szczegółowo

Definicje. Algorytm to:

Definicje. Algorytm to: Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi

Bardziej szczegółowo

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Modelowanie diagramów klas w języku UML Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Czym jest UML - Unified Modeling Language - Rodzina języków modelowania graficznego - Powstanie na przełomie lat 80

Bardziej szczegółowo

Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie

Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie informatycznej. Zadaniem systemu jest rejestracja i przechowywanie

Bardziej szczegółowo

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania Autor: Anna Nowak Promotor: dr inż. Jan Kowalski Kategorie: gra logiczna Słowa kluczowe: Sudoku, generowanie plansz, algorytmy,

Bardziej szczegółowo

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe, wykład nr 6. Klasy i obiekty Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 3 PARADYGMATY PROGRAMOWANIA Wykład 3 Definiowanie operatorów i ich przeciążanie Przykłady zastosowania operatorów: a) operator podstawienia ( = ) obiektów o złożonej strukturze, b) operatory działania na

Bardziej szczegółowo

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH 5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH Temat, którym mamy się tu zająć, jest nudny i żmudny będziemy się uczyć techniki obliczania wartości logicznej zdań dowolnie złożonych. Po co? możecie zapytać.

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

do instrukcja while (wyrażenie);

do instrukcja while (wyrażenie); Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie

Bardziej szczegółowo

Ćwiczenie 1. Przygotowanie środowiska JAVA

Ćwiczenie 1. Przygotowanie środowiska JAVA Ćwiczenie 1 Przygotowanie środowiska JAVA 1. Wprowadzenie teoretyczne Instalacja JDK (Java Development Kit) NaleŜy pobrać z java.sun.com środowisko i zainstalować je. Następnie naleŝy skonfigurować środowisko.

Bardziej szczegółowo

Java Podstawy. Michał Bereta www.michalbereta.pl mbereta@pk.edu.pl

Java Podstawy. Michał Bereta www.michalbereta.pl mbereta@pk.edu.pl Prezentacja współfinansowana przez Unię Europejską ze środków Europejskiego Funduszu Społecznego w ramach projektu Wzmocnienie znaczenia Politechniki Krakowskiej w kształceniu przedmiotów ścisłych i propagowaniu

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Instrukcja wczytywania i przekazywania zbiorów centralnych w Centralnej Aplikacji Statystycznej (CAS) przez użytkowników podobszaru PS

Instrukcja wczytywania i przekazywania zbiorów centralnych w Centralnej Aplikacji Statystycznej (CAS) przez użytkowników podobszaru PS Instrukcja wczytywania i przekazywania zbiorów centralnych w Centralnej Aplikacji Statystycznej (CAS) przez użytkowników podobszaru PS Uwaga! Opisane w niniejszej instrukcji funkcje Centralnej Aplikacji

Bardziej szczegółowo

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Dokumentacja projektu QUAIKE Architektura oprogramowania

Dokumentacja projektu QUAIKE Architektura oprogramowania Licencjacka Pracownia Oprogramowania Instytut Informatyki Uniwersytetu Wrocławskiego Jakub Kowalski, Andrzej Pilarczyk, Marek Kembrowski, Bartłomiej Gałkowski Dokumentacja projektu QUAIKE Architektura

Bardziej szczegółowo

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe zastosowanie języka Java SE Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z

Bardziej szczegółowo

10. Programowanie obiektowe w PHP5

10. Programowanie obiektowe w PHP5 Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE

Bardziej szczegółowo

Maciej Oleksy Zenon Matuszyk

Maciej Oleksy Zenon Matuszyk Maciej Oleksy Zenon Matuszyk Jest to proces związany z wytwarzaniem oprogramowania. Jest on jednym z procesów kontroli jakości oprogramowania. Weryfikacja oprogramowania - testowanie zgodności systemu

Bardziej szczegółowo

Polecenia wsadowe. Automatyzacja procesów przemysłowych jest głównym celem rozwoju oprogramowania

Polecenia wsadowe. Automatyzacja procesów przemysłowych jest głównym celem rozwoju oprogramowania Polecenia wsadowe Wstęp Automatyzacja procesów przemysłowych jest głównym celem rozwoju oprogramowania dedykowanego maszynom CNC. SigmaNEST wychodzi naprzeciw użytkownikom programu, dlatego dla dodatkowego

Bardziej szczegółowo

Podstawowym zadaniem, które realizuje

Podstawowym zadaniem, które realizuje Funkcje wyszukiwania i adresu INDEKS Mariusz Jankowski autor strony internetowej poświęconej Excelowi i programowaniu w VBA; Bogdan Gilarski właściciel firmy szkoleniowej Perfect And Practical; Pytania:

Bardziej szczegółowo

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/ Język programowania Andrzej Bobyk http://www.alfabeta.lublin.pl www.alfabeta.lublin.pl/jp/ Literatura K. Reisdorph: Delphi 6 dla każdego. Helion, Gliwice 2001 A. Grażyński, Z. Zarzycki: Delphi 7 dla każdego.

Bardziej szczegółowo

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016 Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal

Bardziej szczegółowo

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik Dlaczego obiekty Załóżmy, że mamy napisać program o następującej specyfikacji: 1. Program wyświetla

Bardziej szczegółowo

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania

Bardziej szczegółowo

Programowanie 3 - Funkcje, pliki i klasy

Programowanie 3 - Funkcje, pliki i klasy Instytut Informatyki Uniwersytetu Śląskiego Laborki funkcja; parametry funkcji; typ zwracany; typ void; funkcje bez parametrów; napis.length() - jako przykład funkcji. Zadania funkcja dodająca dwie liczby;

Bardziej szczegółowo

Spis treści. 1 Java T M

Spis treści. 1 Java T M Spis treści 1 Java T M 1 2 Co to jest Platforma Java T M 1 3 Przygotowanie komputera 2 4 Pierwszy program 2 5 Dokumentacja 3 6 Budowa aplikacji. Klasy. 3 7 Pola i metody 4 8 Konstruktory 5 9 Inne proste

Bardziej szczegółowo

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH Mirosław Gołda, Programista Java Agenda Kilka słów o języku Groovy Wpięcie Grooviego w projekt Springowy Testy jednostkowe

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

Tom 6 Opis oprogramowania Część 8 Narzędzie do kontroli danych elementarnych, danych wynikowych oraz kontroli obmiaru do celów fakturowania

Tom 6 Opis oprogramowania Część 8 Narzędzie do kontroli danych elementarnych, danych wynikowych oraz kontroli obmiaru do celów fakturowania Część 8 Narzędzie do kontroli danych elementarnych, danych wynikowych oraz kontroli Diagnostyka stanu nawierzchni - DSN Generalna Dyrekcja Dróg Krajowych i Autostrad Warszawa, 21 maja 2012 Historia dokumentu

Bardziej szczegółowo

Najwyżej ocenione raporty dla Mr Buggy 4

Najwyżej ocenione raporty dla Mr Buggy 4 Najwyżej ocenione raporty dla Mr Buggy 4 Uwagi Komisji: 1. Żaden z raportów nie otrzymał maksymalnej liczby punktów. 2. Poniżej prezentowane są oryginalne wersje raportów z usuniętymi danymi mogącymi identyfikować

Bardziej szczegółowo

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe Architektury Usług Internetowych Laboratorium 2. Usługi sieciowe Wstęp Celem laboratorium jest zapoznanie się z modelem usług sieciowych na przykładzie prostego serwera Apache Axis2. Apache Axis2 Apache

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

C++ - [4-7] Polimorfizm

C++ - [4-7] Polimorfizm Slajd 1 z 14 C++ - [4-7] Polimorfizm Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 20 maja 2013 r. Slajd 2 z 14 Polimorfizm i klasa polimorficzna POLIMORFIZM (cytat z Wikipedii) (wielopostaciowość)

Bardziej szczegółowo

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

Język JAVA podstawy. wykład 1, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 1, część 3 1 Język JAVA podstawy Plan wykładu: 1. Krótka historia Javy 2. Jak przygotować sobie środowisko programistyczne 3. Opis środowiska JDK 4. Tworzenie programu krok po

Bardziej szczegółowo

Modelowanie i Programowanie Obiektowe

Modelowanie i Programowanie Obiektowe Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do

Bardziej szczegółowo

Instrukcja zgłaszania błędu

Instrukcja zgłaszania błędu Instrukcja zgłaszania błędu 1 Kanały zgłaszania Do dyspozycji są trzy kanały zgłoszeń: A. AnswerTrack 2 aby skorzystać z tego kanału należy posiadać założone konto użytkowania AT2 (pkt.3), wypełnić formularz

Bardziej szczegółowo

SUBIEKT GT IMPORT XLS Dokumenty

SUBIEKT GT IMPORT XLS Dokumenty Instrukcja użytkownika programu SUBIEKT GT IMPORT XLS Dokumenty Wersja 1.0.0 OPIS PROGRAMU Program Subiekt GT Import XLS - Dokumenty służy do importowania różnych dokumentów handlowych i magazynowych (faktury

Bardziej szczegółowo

Instrukcja obsługi programu PowRek

Instrukcja obsługi programu PowRek Instrukcja obsługi programu PowRek środa, 21 grudnia 2011 Spis treści Przeznaczenie programu... 4 Prezentacja programu... 5 Okno główne programu... 5 Opis poszczególnych elementów ekranu... 5 Nowy projekt...

Bardziej szczegółowo

Program 14. #include #include using namespace std;

Program 14. #include <iostream> #include <ctime> using namespace std; Program 14 Napisać: * funkcję słuŝącą do losowego wypełniania tablicy liczbami całkowitymi z podanego zakresu (*). Parametrami funkcji mają być tablica, jej długość oraz dwie liczby stanowiące krańce przedziału

Bardziej szczegółowo

Systemy baz danych w zarządzaniu przedsiębiorstwem. W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi

Systemy baz danych w zarządzaniu przedsiębiorstwem. W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi Systemy baz danych w zarządzaniu przedsiębiorstwem W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi Proces zarządzania danymi Zarządzanie danymi obejmuje czynności: gromadzenie

Bardziej szczegółowo

Procesowa specyfikacja systemów IT

Procesowa specyfikacja systemów IT Procesowa specyfikacja systemów IT BOC Group BOC Information Technologies Consulting Sp. z o.o. e-mail: boc@boc-pl.com Tel.: (+48 22) 628 00 15, 696 69 26 Fax: (+48 22) 621 66 88 BOC Management Office

Bardziej szczegółowo

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++ Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

Katalog książek cz. 2

Katalog książek cz. 2 Katalog książek cz. 2 Odczytywanie danych z XML Do ćwiczenia dołączony jest plik books.xml zawierający pełen katalog książek. Poniższy listing zawiera przykładowy fragment danych w stosowanym formacie.

Bardziej szczegółowo

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu. AGH, EAIE, Informatyka Winda - tutorial Systemy czasu rzeczywistego Mirosław Jedynak, Adam Łączyński Spis treści 1 Wstęp... 2 2 Przypadki użycia (Use Case)... 2 3 Diagramy modelu (Object Model Diagram)...

Bardziej szczegółowo

Programowanie poprzez testy z wykorzystaniem JUnit

Programowanie poprzez testy z wykorzystaniem JUnit Programowanie poprzez testy z wykorzystaniem JUnit Programowanie ekstremalne (XP) XP zaproponowano w 1999 (K. Beck: Extreme Programming Explained ) XP dedykowane jest do projektów: O małym lub średnim

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo