Symulator gry na giełdzie "Stock Shark"



Podobne dokumenty
Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Spis treści. Wstęp. Pierwsze logowanie. Wygląd platformy po zalogowaniu. Składnianie zleceń. Widok nowego zlecenia na wykresie oraz w zakładce handel

Przewodnik użytkownika (instrukcja) AutoMagicTest

Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller

Baza danych sql. 1. Wprowadzenie

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor

Produkcja by CTI. Proces instalacji, ważne informacje oraz konfiguracja

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

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

Backend Administratora

Dokumentacja Administratora portalu. aplikacji. Wirtualna szkoła

Webowy generator wykresów wykorzystujący program gnuplot

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Platforma e-learningowa

app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji src/ - folder zawiera cały kod PHP aplikacji

Przewodnik po Notowaniach Statica mdm 4

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Laboratorium Technologii Informacyjnych. Projektowanie Baz Danych

app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji Można wybrać sposób zapisu konfiguracji: YML, XML, PHP

Dokument Detaliczny Projektu

Instalacja SQL Server Express. Logowanie na stronie Microsoftu

Produkcja by CTI. Proces instalacji, ważne informacje oraz konfiguracja

Płace Optivum. 1. Zainstalować serwer SQL (Microsoft SQL Server 2008 R2) oraz program Płace Optivum.

4. Podstawowa konfiguracja

Widoki zagnieżdżone, layout. 1. Wprowadzenie Repozytoria danych

Usługi analityczne budowa kostki analitycznej Część pierwsza.

Podręcznik użytkownika Obieg dokumentów

Tworzenie i wykorzystanie usług sieciowych

REFERAT PRACY DYPLOMOWEJ

Currenda EPO Instrukcja Konfiguracji. Wersja dokumentu: 1.3

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Laboratorium 7 Blog: dodawanie i edycja wpisów

ASP.NET MVC. Grzegorz Caban 20 stycznia 2009

Day Trading System. Podręcznik Użytkownika

etrader Pekao Podręcznik użytkownika Monitor transakcji

PRZEWODNIK PO ETRADER PEKAO ROZDZIAŁ X. MONITOR TRANSAKCJI SPIS TREŚCI

Aplikacja do podpisu cyfrowego npodpis

Wdrożenie modułu płatności eservice. dla systemu Magento

Kurs ASP.NET ASP.NET CORE APLIKACJE WEBOWE

R o g e r A c c e s s C o n t r o l S y s t e m 5

Wstęp. Opis ten dotyczy wydziałów orzeczniczych.

Monitoring procesów z wykorzystaniem systemu ADONIS. Krok po kroku

Przewodnik instalacji i rozpoczynania pracy. Dla DataPage+ 2013

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

REFERAT O PRACY DYPLOMOWEJ

Wprowadzenie do projektu QualitySpy

Pulpit Inwestora. Podręcznik użytkownika. Spis treści

Procesowa specyfikacja systemów IT

Instrukcja użytkownika Platformy Walutowej

PRZEWODNIK PO SERWISIE BRe BROKERS Rozdział 6

NOL3. Zarządzanie zleceniami. 1. Transakcyjne funkcjonalności aplikacji NOL3. Biuro Maklerskie Zlecenia

Przykładowa baza danych BIBLIOTEKA

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Kurs walut. Specyfikacja projektu. Marek Zając

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Opis modułu pl.id w programie Komornik SQL-VAT

ROZPOCZĘCIE PRACY Z PLATFORMĄ INFRONT

ECDL ZARZĄDZANIE PROJEKTAMI

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Instrukcja użytkownika Platforma Walutowa

Instrukcja instalacji i obsługi programu Szpieg 3

Szpieg 2.0 Instrukcja użytkownika

System zarządzający grami programistycznymi Meridius

Rozdział ten zawiera informacje o sposobie konfiguracji i działania Modułu OPC.

Symfonia Produkcja Instrukcja instalacji. Wersja 2013

Plan. Aplikacja. Architektura aplikacji. Architektura aplikacji Tworzenie aplikacji Application Builder podstawy

Baza danych i ORM mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Instrukcja 3 Laboratoria 3, 4 Specyfikacja wymagań funkcjonalnych za pomocą diagramu przypadków użycia

Praca w programie dodawanie pisma.

MentorGraphics ModelSim

Podręcznik Użytkownika LSI WRPO

(aktualizacja 30 kwietnia 2018)

IO - Plan testów. M.Jałmużna T.Jurkiewicz P.Kasprzyk M.Robak. 5 czerwca 2006

Instrukcja użytkownika Platforma transakcyjna mforex Trader dla systemu MacOS

REFERAT O PRACY DYPLOMOWEJ

W grze bierze udział dwóch graczy. Każdy uczestnik rozpoczyna rozgrywkę z sumą

Przewodnik użytkownika (instrukcja) AutoMagicTest

Instrukcja użytkownika

System magazynowy małego sklepu.

Forte Zarządzanie Produkcją Instalacja i konfiguracja. Wersja B

Instrukcja obsługi Zaplecza epk w zakresie zarządzania tłumaczeniami opisów procedur, publikacji oraz poradników przedsiębiorcy

Poradnik zetula.pl. Jak założyć konto na zetula.pl. i zabezpieczyć dane na swoim komputerze?

Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny

Automatyzacja Testowania w WEB 2.0

Dokument Detaliczny Projektu

Instrukcjaaktualizacji

Instrukcja laboratoryjna

PRODUKCJA BY CTI INSTRUKCJA INSTALACJI I KONFIGURACJI

Opis zmian funkcjonalności platformy E-GIODO wprowadzających możliwość podpisania wniosku bezpośrednio w oknie przeglądarki.

Przewodnik instalacji i rozpoczynania pracy. dla DataPage+ 2012

Modele danych walidacja widoki zorientowane na model

REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i realizacja serwisu ogłoszeń z inteligentną wyszukiwarką

podstawowa obsługa panelu administracyjnego

Transkrypt:

Marcin Fijałkowski, 163894 Wrocław, 22.05.2012 Piotr Kłys, 171168 Mateusz Krawczyk, 171031 grupa WT/13 Symulator gry na giełdzie "Stock Shark" Dokumentacja do projektu z Zastosowania Informatyki w Gospodarce rok akad. 2011/2012, kierunek INF prowadzący: dr inż. Katarzyna Nowak

Spis treści 1. Cel i założenia projektu... 3 2. Technologia wykonania... 4 3. Mapa portalu... 5 3.1. Nawigacja... 5 3.2. Mapa URL... 5 3.3. Przykładowe screeny... 7 4. Struktura projektu... 9 4.1. Struktura projektu głównego... 9 4.2. Struktura projektu z testami... 11 5. Warstwa modelu i baza danych... 12 5.1. Ogólne informacje... 12 5.2. Schemat bazy danych... 12 5.3. Opis modelu danych... 14 6. Notowania giełdowe... 15 7. Testy... 24 2

1. Cel i założenia projektu Celem naszego projektu było stworzenie aplikacji symulującej grę na giełdzie. Stworzona została aplikacja webowa, do której każdy z graczy będzie miał dostęp poprzez przeglądarkę internetową. Dzięki takiemu rozwiązaniu do aktywnego grania wystarczy dowolny komputer z dostępem do Internetu. Każdy gracz swoją przygodę z giełdą zaczyna od zarejestrowania się w systemie. Następnie zakłada swoje wirtualne konta - może być ich maksymalnie 5, a na każdym z nich początkowo znajduję się 50 000 PLN. Dzięki tym rachunkom gracz ma możliwość nabywać, a później handlować wirtualnymi instrumentami finansowymi. Oczywistym celem gry jest uzyskanie jak największego zysku, dzięki odpowiedniemu zarządzaniu swoimi rachunkami. W razie bankructwa któregoś z kont można w jego miejsce utworzyć nowe. Prowadzony jest również ranking graczy - na podstawie sumarycznej wartości wszystkich kąt. Instrumenty finansowe, którymi uczestnicy gry będą handlować dzielimy na: akcje spółek notowanych na GPW - Rynek Główny oraz New Connect indeksy notowane na GPW waluty obce surowce Ceny wszystkich dostępnych w grze instrumentów finansowych są zgodne z realnymi kursami na Giełdzie Papierów Wartościowych. Gracze mają również dostęp do wykresów, pokazujących jak kształtowały się w czasie wartości poszczególnych akcji, można sprawdzić historię operacji na każdym z rachunków, wartość portfela z uwzględnieniem poszczególnych instrumentów. Do dyspozycji użytkowników jest także słownik pojęć giełdowych, harmonogram pracy giełdy oraz wprowadzenie do świata gry giełdowej. Zarządzanie projektem odbywało się drogą internetową oraz na spotkaniach grupy. Aby w prosty sposób wymieniać się plikami z kodem źródłowym, skryptami użyliśmy technologii SVN i odpowiednich narzędzi wykorzystujących ją. Dodatkowo został założony GoogleCode, na którym jest umieszczony harmonogram projektu, podział zadań, linki do stron pomocnych w tworzeniu aplikacji. 3

2. Technologia wykonania Głównym językiem, w którym została wykonana aplikacja jest C# oraz technologia.net. Jest to język stworzony specjalnie do współpracy z frameworkiem.net (bez niego program się nie uruchomi). Ma on wiele cech wspólnych z innymi językami takimi jak C++ czy Java. Dodatkowo została użyta platforma aplikacyjna ASP.NET MVC, która została stworzona z myślą o aplikacjach internetowych. Wybór systemu bazodanowego był w dużym stopniu podyktowany wcześniejszymi technologiami, które zostały wybrane. MSSQL zapewnia wszystkie niezbędne narzędzia do sprawnego działania projektu. Nasz projekt jest aplikacją webową więc nie mogło zabraknąć w nim takich elementów jak (X)HTML i CSS, które odpowiadają za wygląd w przeglądarce, a także rozkład stron. Użyliśmy też powiązane z wcześniej wymienioną Javą - JavaScript i JQuery. Są to języki najczęściej wykorzystywane w tworzeniu stron internetowych i różnych z tym związanych elementów. Należy też wspomnieć o Entity Framework, który jest narzędziem przeznaczonym do budowania aplikacji dwu - i trzy - warstwowych co w znacznym stopniu ułatwia tworzenie bardziej zaawansowanych aplikacji. Użyty został także język LINQ, który jest także integralną częścią środowiska.net. Umożliwia on zadawanie pytań na obiektach, a jego składnia przypomina język SQL. Dzięki niemu mamy powiązanie z bazą danych, XML. Do tworzenia wykresów użyta została biblioteka FLOT, która pracuje pod JQuery. Najważniejszą technologią, którą wykorzystaliśmy jest MVC czyli Model View Controller. Jest to architektoniczny wzorzec projektowy w informatyce, który służy do organizowania struktur aplikacji posiadających graficzne interfejsy użytkownika. Składają się na niego 3 główne części, które są ze sobą wzajemnie połączone: model - jest to pewna reprezentacja problemu bądź logiki aplikacji widok - opisuje, jak wyświetlić pewną część modelu w ramach GUI kontroler - przyjmuje dane od użytkownika, aktualizuje model, odświeża widoki Microsoft przygotował swoją własną implementację MVC. Pozwala ona na budowanie aplikacji z uwzględnieniem wyraźnie odseparowanych modeli, kontrolerów i widoków. Największą zaletą ASP.NET MVC jest duża elastyczność. Aby móc skompilować aplikację należy mieć zainstalowane odpowiednie biblioteki: ASP.NET MVC 3 (http://www.microsoft.com/web/gallery/install.aspx?appsxml=&appid=mvc3).net Framework 4.0 (http://www.microsoft.com/en-us/download/details.aspx?id=17851) MSSQL Express 2008 (http://www.microsoft.com/en-us/download/details.aspx?id=1695) JQuery (http://blog.jquery.com/2011/11/21/jquery-1-7-1-released/) 4

3. Mapa portalu 3.1. Nawigacja Po uruchomieniu aplikacji w oknie przeglądarki ukaże się nam strona powitalna, dzięki której możemy przejść do zakładki logowania lub zakładania nowego konta. Dodatkowo mamy informację o czasie serwera oraz czy giełda jest otwarta czy zamknięta. Pierwszą zakładką są "Notowania" - możemy tam podejrzeć jak wyglądają kursy poszczególnych akcji, indeksów, walut i surowców. Wszystkie one są podzielone na identyczne kategorie jak na GPW. Po przejściu do którejś z wymienionych grup widzimy tabelę z najważniejszymi informacjami o danym instrumencie finansowy. Możemy także sprawdzić dokładne informacje każdej akcji, indeksu klikając na jego nazwę. Jest tam również wykres przedstawiający wcześniejsze notowania. Kolejną zakładką, do której mamy dostęp bez logowania się, jest "Gra". Jest to dział, w którym uzyskamy podstawowe informacje na temat gry. W zasadach gry opisane są najważniejsze reguły obowiązujące w aplikacji - cel, maksymalna ilość rachunków, handel instrumentami, prowizje domów maklerskich, informację o notowaniach. Kolejną zakładką jest harmonogram, dzięki któremu wiadomo w jakich godzinach można grać na giełdzie - kiedy są sesje konkretnych rodzajów instrumentów. Następnie jest słownik podstawowych pojęć giełdowych, dzięki któremu będzie łatwiej zrozumieć fachowe nazewnictwo obowiązujące na giełdzie papierów wartościowych. W tym dziale mamy jeszcze ranking najlepszych graczy oraz informację o autorach aplikacji. Po zalogowaniu mamy informację o posiadanych rachunkach i ich zawartości oraz o obserwowanych notowaniach. Wchodząc na konkretny rachunek widzimy zawartość portfela, możemy złożyć zlecenie kupna lub sprzedaży nowych akcji lub już przez nas posiadanych. Dodatkowo możemy obejrzeć wykresy dotyczące bieżącego rachunku (podział portfela, wartość rachunku w czasie) oraz przejrzeć oczekujące zlecenia i historię transakcji. 3.2. Mapa URL Mapa portalu została stworzona zgodnie z routingiem domyślnym technologii ASP.NET MVC: /Home o /Index - strona glowna o /About - informacje techniczne, autorzy, kontakt o /Rules - opis i zasady gry o /Schedule - harmonogram gieldy o /Scoreboard?page=... - ranking o /Watch?item=... - dodawanie do obserowwanych o /Unwatch?item=... - usuwanie z obserwowanych o /Dictionary?letter=... - słownik pojęć 5

/Quotations o /Index - odnosniki do stron (List) z poszczegolnymi kategoriami o /List?type=... - alfabetyczna lista walorow danego typu o /Details?item=...&period=... - szczegolowe info dot. danego waloru + wykres na okres period (dzien, tydzien miesiac, etc) /BrokerageAccount o /Index - lista kont maklerskich z odnosnikami o /Details?name=... - dane szczegolowe rachunku o danej nazwie - saldo, lista posiadanych walorow, wartosc sumaryczna portfela, zlecenia i historia transakcji (okrojone) o /History?name=... - pelna historia transakcji na rachunku o danej nazwie (chronologicznie) o /Orders?name=... - pelna lista oczekujacych na wykonanie zlecen na rachunku o danej nazwie (chronologocznie po dacie zlecenia) o /Charts?name=...&period=... - wykresy i statystyki zwiazane z rachunkiem (wykres wartosci portfela na okres period (tydzien, miesiac, etc), wykres podzialu portfela na typy walorow) o /Create - tworzenie nowego rachunku o /Edit?name=... - edycja rachunku o danej nazwie (zmiana nazwy) o /Delete?name=... - usuniecie rachunku o danej nazwie /Order o /BuyList?account=... - lista walorow mozliwych do kupienia o /Buy?account=...&item= - kupno danego walory na danym rachunku o /SellList?account=... - lista walorow mozliwych do sprzedania o /Sell?account=...&item= - sprzedaz danego waloru na danym rachunku o /Cancel?order=... - anulowanie wybranego zlecenia /Account o /ChangePassword - zmiana hasła użytkownika o /ChangePasswordSuccess - pomyślnie wykonana zmiana hasła o /LogOn - logowanie na konto gracza o /Register - rejestracja nowego gracza 6

3.3. Przykładowe screeny Poniżej przedstawione zostały zrzuty ekranu z przykładowych stron portalu. Rys 1. Screen strony startowej Rys 2. Screen strony z notowaniami 7

Rys 3. Screen strony z wykresami dotyczącymi rachunku maklerskiego Rys 4. Screen strony z danymi i notowaniami wybranej akcji 8

4. Struktura projektu Niniejszy projekt wykonany został zgodnie z wzorcem MVC, co oznacza, iż aplikacja podzielona została na trzy główne części - model, widok i kontroler. Struktura projektu odzwierciedla ten podział, rozszerzając go jednocześnie w celu ujęcia aspektów projektu nie związanych bezpośrednio z jej kodem źródłowym, takich jak skrypty JavaScript i arkusze stylów CSS. Ponadto cały projekt (solucja) podzielony został na dwa podprojekty - projekt główny aplikacji oraz projekt zawierający testy. 4.1. Struktura projektu głównego Poniżej przedstawione i opisane zostały najważniejsze elementy składające się na całość projektu głównego, zgodnie z ich hierarchią. /References/ - katalog ten zawiera referencje do wszystkich bibliotek wykorzystywanych do kompilacji i konsolidacji programu. Visual Studio dodaje większość wymaganych referencji automatycznie przy tworzeniu nowego projektu ASP.NET MVC, należy się jednak upewnić co do kilku elementów, które nie są standardowo umieszczane: o EntityFramework o Microsoft.SqlServer.ConnectionInfo o Microsoft.SqlServer.Management.Sdk.Sfc o Microsoft.SqlServer.Smo o Microsoft.SqlServer.SqlEnum /App_Data/ - w tym katalogu tradycyjnie umieszcza się obiekty służące do przechowywania danych, jak np. pliki bazy danych SQL CE. W naszym projekcie korzystamy jednak z bazy danych SQL Express, której pliki zawarte są w systemie plików poza projektem. W związku z tym katalog ten pozostaje pusty. /BusinessModels/ - katalog ten utworzony został w celu odseparowania kodu dotyczącego wewnętrznej logiki biznesowej aplikacji. Zawiera on klasy dokonujące skomplikowanych operacji logicznych i bazodanowych oraz definiujące różne parametry rządzące działaniem programu. o GameProperties.cs - klasa ta zawiera parametry oraz funkcje pomocnicze, wpływające na ustawienia aplikacji (wysokość prowizji maklerskich, dni pracy giełdy, etc) o InstrumentsSynchronizer.cs - klasa ta zawiera metody służące do codziennej synchronizacji i aktualizacji niektórych danych zawartych w bazie, jak np. dodawanie obecnych kursów walorów do historii notowań, usuwanie przedawnionych zleceń, etc o InstrumentsTrigger.cs - klasa ta tworzy dodatkowy wątek, którego celem jest automatyczne wywoływanie aktualizacji notowań w określonych odstępach czasu o InstrumentsUpdater.cs - klasa ta zawiera metody służące do aktualizacji kursów poszczególnych walorów w oparciu o wartości sparsowane ze stron internetowych o StockQuotesParser.cs - klasa ta służy do pobierania stron zawierających aktualne notowania instrumentów finansowych oraz do parsowania ich treści w celu odczytania interesujących nas wartości 9

o TradeCenter.cs - klasa ta definiuje jedną metodę, która służy do przeglądania oczekujących zleceń i wykonywanie tych transakcji, dla których spełnione są wymagane warunki /Content/ - katalog ten zawiera pliki statyczne wykorzystywane w aplikacji o /images/ - zawiera pliki obrazów o /themes/ - zawiera arkusze stylów CSS związane z elementami JQuery UI (niewykorzystywane w projekcie) o Site.css - główny arkusz stylów CSS, definiujący wygląd całego portalu /Controllers/ - katalog ten gromadzi klasy warstwy kontrolera MVC, czyli klasy służące do obsługi żądań HTTP i generowania odpowiednich plików HTML o AccountController.cs - klasa obsługująca część portalu dotyczącą zarządzania kontami użytkowników oraz ich uwierzytelnianiem o BrokerageAccountController.cs - klasa obsługująca część portalu związaną z obsługą rachunków maklerskich o HomeController.cs - klasa obsługująca strony portalu nie związane bezpośrednio z innymi kontrolerami, w tym stronę startową o OrderController - klasa obsługująca część portalu odpowiedzialną za umożliwienie składania i anulowania zleceń giełdowych o QuotationsController - klasa obsługująca część portalu związaną z prezentacją notowań oraz innych szczegółów dotyczących instrumentów finansowych /Models/ - katalog zawierający klasy warstwy modelowej MVC, a więc klasy związane z gromadzeniem i przetwarzaniem danych wykorzystywanych w aplikacji o AccountModels.cs - klasa definiująca typy danych związane z obsługą kont użytkowników o SSInitializer.cs - klasa mająca za zadanie wypełnienie nowo utworzonej bazy danymi dotyczącymi instrumentów finansowych oraz danymi testowymi o StockSharkDB.cs - klasa określająca listę danych przechowywanych w bazie (encje) o inne - reszta klas definiuje bezpośrednio typy danych, które odpowiadają encjom (tabelom) w bazie danych /Scripts/ - katalog ten zawiera zewnętrzne skrypty JavaScript wykorzystywane na stronach portalu, przede wszystkim skrypty biblioteki JQuery /ViewModels/ - w tym katalogu umieszczone zostały klasy służące do agregacji danych z różnych klas warstwy modelowej w jednym obiekcie, w celu przekazania go do warstwy widoku o BAChartsData.cs - klasa ta zawiera dane i metody służące do generowania wykresów związanych z rachunkiem maklerskim (dziedziczy po ChartData) o ChartData.cs - klasa definiująca część wspólną danych i metod dla generowania wykresów o InstrumentChartData.cs - klasa zawierająca dane i metody służące do generowania wykresów związanych z notowaniami (dziedziczy po ChartData) o PeriodList.cs - pomocnicza klasa służąca do generowania listy okresów czasu dla wykresów oraz wyliczania daty początkowej dla tych okresów 10

o o ScoreboardData.cs - klasa zawierająca dane wykorzystywane do prezentacji rankingu rachunków maklerskich StartPageData.cs - klasa zawierająca dane wykorzystywane w widoku strony startowej portalu /Views/ - katalog ten zawiera szablony dokumentów HTML (Razor templates) wykorzystywane do generowania stron portalu, czyli warstwę widoku MVC o /Shared/ - katalog przechowujący szablony współdzielone, wykorzystywane do generowania fragmentów wielu różnych stron _Layout.cshtml - szablon główny definiujący szkielet (ogólną strukturę) dla wszystkich stron portalu, w tym główne kontenery oraz menu _LogOnPartial.cshtml - szablon zawierający informacje dotyczące logowania, wyświetlane w prawym górnym rogu _QuotationsPartial.cshtml - szablon służący do generowania wierszy tabeli z notowaniami walorów Error.cshtml - szablon strony zawierającej komunikat o błędzie o _ViewStart.cshtml - szablon wskazujący na plik z szablonem głównym o Web.config - plik XML z konfiguracją dotyczącą warstwy widokowej o inne - reszta katalogów odpowiada klasom warstwy kontrolnej, a pliki szablonów w nich zawarte - metodom publicznym owych klas. Szablony te służą do prezentacji danych zwracanych przez metody klas kontrolera. Global.asax o Global.asax.cs - plik definiujący główną klasę aplikacji, odpowiadającą za wykonanie czynności niezbędnych przy jej uruchomieniu packages.config - plik XML z konfiguracją dotyczącą wykorzystywanych bibliotek Web.config - plik XML zawierający ogólną konfigurację aplikacji webowej o Web.debug.config - konfiguracja szczególna dla uruchomienia w trybie Debug o Web.debug.release - konfiguracja szczególna dla uruchomienia w trybie Release 4.2. Struktura projektu z testami Dalej, przedstawione i opisane zostały najważniejsze elementy składające się na całość projektu zawierającego testy, zgodnie z ich hierarchią. /References/ - katalog ten zawiera referencje do wszystkich bibliotek wykorzystywanych do kompilacji i konsolidacji programu, przede wszystkim: o StockShark - referencja do projektu głównego, którego klasy będą testowane /BusinessModels/ - katalog zawierający testy jednostkowe klas zawartych w katalogu BusinessModels w projekcie głównym /Controllers/ - katalog zawierający testy jednostkowe klas zawartych w katalogu Controllers w projekcie głównym /LoadTests/ - katalog zawierający testy obciążeniowe dla aplikacji webowej App.config - plik XML zawierający konfigurację aplikacji testującej 11

5. Warstwa modelu i baza danych 5.1. Ogólne informacje Warstwa modelowa projektu została w całości oparta na danych, które przechowywane są w bazie danych MS SQL Express 2008. Przy tworzeniu tej warstwy zastosowano tzw. "Code-first approach", czyli takie podejście, w którym najpierw definiowane są klasy obiektów z danymi, a następnie na ich podstawie generowana są odpowiednie tabele i relacje w bazie. W związku z tym podejściem, każda (niemal) zmiana w klasach modelu pociąga za sobą konieczność aktualizacji schematu bazy danych. Aplikacja sama wykrywa, takie zmiany zaszły i kiedy aktualizacja jest konieczna. Należało więc określić strategię działania w razie zajścia takiej sytuacji. Zdecydowano się na opcję "Drop&Create", czyli usunięcie i utworzenie całej bazy danych na nowo. W tym celu właśnie powstała klasa SSInitializer, która ma za zadanie wypełnienie nowo utworzonej bazy danymi. Część z tych danych do dane testowe (przykładowe konta użytkowników i rachunki maklerskie), a część to rzeczywiste dane dotyczące instrumentów finansowych. Te ostatnie zawarte zostały w zewnętrznych plikach SQL, w folderze Skrypty. Warto również tutaj wspomnieć o sposobie łączenia się aplikacji z bazą danych SQL Express. W celu zdefiniowania tego połączenia dodany został następujący wpis w głównym pliku Web.config projektu: <connectionstrings> <add name="stocksharkdb" connectionstring="data source=.\sqlexpress;integrated Security=SSPI;Initial Catalog=StockSharkDB;" providername="system.data.sqlclient" /> </connectionstrings> Listing 1. definicja połączenia aplikacji z bazą danych (connectionstring) Wpis ten definiuje nowy connectionstring o następujących parametrach: name - nazwa połączenia connectionstring - ciąg znaków definiujących połączenie o data source=.\sqlexpress - źródło danych, czyli baza SQL Express na lokalnym hoście o Integrated Security=SSPI - sposób uwierzytelniania dostępu do bazy o Initial Catalog=StockSharkDB - nazwa bazy danych - StockSharkDB 5.2. Schemat bazy danych Schemat bazy danych StockSharkBD, która została wygenerowana na podstawie klas modelu, opisuje poniższy diagram ERD. 12

Rys 5. Diagram ERD bazy danych 13

5.3. Opis modelu danych Poniżej przedstawiony został opis poszczególnych klas modelu, wraz z ich istotnymi atrybutami (pomijając atrybuty klucza głównego i kluczy obcych). BrokerageAccount - klasa z danymi dotyczącymi rachunku maklerskiego o [string] Name - nazwa rachunku o [decimal] Balance - wolne środki (PLN) o [decimal] TotalValue - łączna wartość portfela (PLN) o [DateTime] CreationDate - data otwarcia rachunku AccountValue - klasa opisująca historyczną wartość rachunku maklerskiego o [DateTime] Timestamp - data o [decimal] Value - łączna wartość portfela tego dnia (PLN) ExecutedTransaction - klasa opisująca wykonaną transakcję giełdową na rachunku o [int] Quantity - liczba kupionych/sprzedanych jednostek waloru o [decimal] UnitPrice - cena jednostkowa waloru (PLN) o [bool] BuyNotSell - rozróżnienie pomiędzy transakcją kupna i sprzedaży o [DateTime] ExecutonDate - data wykonania transakcji o [decimal] Commission - pobrana prowizja maklerska (PLN) Order - klasa opisująca oczekujące zlecenie kupna/sprzedaży na rachunku o [int] Quantity - liczba jednostek waloru do kupienia/sprzedania o [decimal] PriceLimit - limit ceny (max dla kupna, min dla sprzedaży) (PLN) o [bool] BuyNotSell - rozróżnienie pomiędzy zleceniem kupna i sprzedaży o [DateTime] IssuingDate - data złożenia zlecenia o [DateTime] Deadline - data ważności zlecenia o [bool] AllowPartial - zezwolenie na wykonanie części zlecenia w przypadku braku środków / dostępnych walorów OwnedInstrument - klasa opisująca posiadane walory na rachunku o [int] Quantity - liczba posiadanych jednostek waloru WatchedInstrument - klasa opisująca obserwowany walor przez danego użytkownika Quotation - klasa opisująca historyczną wartość notowania danego waloru o [DateTime] Timestamp - data o [decimal] Value - kurs waloru w danym dniu (PLN, pkt) Instrument - klasa opisująca dany walor (instrument finansowy) o [string] Name - pełna nazwa waloru o [string] Acronym - skrót nazwy o [decimal] CurrentPrice - kurs bieżący (PLN, pkt) o [decimal] ReferencePrice - kurst odniesienia (PLN, pkt) o [string] Description - opis waloru o [string] WebLink - link do zewnętrznej strony WWW z opisem waloru o [string] Market - rynek, na którym notowany jest dany walor Share - klasa opisująca daną akcję (dziedziczy po Instrument) o [bool] Fixing - akcja notowana w systemie jednolitym o [string] Sector - sektor, w którym działa firma związana z daną akcją 14

Currency - klasa opisująca daną walutę (dziedziczy po Instrument) Material - klasa opisująca dany surowiec (dziedziczy po Instrument) Index - klasa opisująca dany indeks giełdowy (dziedziczy po Instrument) 6. Notowania giełdowe 6.1. O notowaniach Jednym z podstawowych wymagań funkcjonalnych postawionych przed tworzoną aplikacją i niezbędnych w jak najbardziej realistycznym odwzorowaniu gry na giełdzie, było zapewnienie użytkownikom rzeczywistych oraz aktualnych danych giełdowych, mających swe odzwierciedlenie w aktualnych notowaniach na Giełdzie Papierów Wartościowych w Warszawie. Wśród notowań które należało odwzorować w aplikacji można wyróżnić cztery rodzaje walorów: indeksy, akcje, surowce, waluty. Ze względu na specyfikę poszczególnych notowań oraz harmonogram ich aktualizacji na giełdzie, dokonano kolejnego podziału uwzględniającego: notowania ciągłe indeksy oraz akcje aktualizowane przez cały czas trwania sesji na giełdzie (9:00 17.30), notowania jednolite akcje aktualizowane dwa razy dziennie (11:15-11:30 pierwszy fixing oraz 15:15-15:30 drugi fixing), notowania New Connect indeksy oraz akcje z giełdy New Connect aktualizowane przez cały czas trwania sesji na giełdzie (9:00 17.30), surowce aktualizowane pomiędzy 8.30 a 17.30, waluty - aktualizowane pomiędzy 8.30 a 17.30. Tak określone zbiory indeksów, akcji, surowców i walut aktualizowano poprzez wykorzystanie bieżących notowań giełdowych udostępnianych prze GPW (15 minutowe opóźnienie dla niekomercyjnych użytkowników). Ze względu na strukturę poszczególnych stron internetowych udostępniających notowania giełdowe i wynikającej z tego szybkości oraz stopnia skomplikowania procesu parsowania danych, jako źródło notowań wybrano kanał tematyczny Biznes oferowany przez portal Onet.pl. Kanał ten oprócz prostej, przejrzystej i stałej struktury poszczególnych stron, oferował także wspomniany wcześniej podział notowań na ciągłe, jednolite, New Connect, surowce i waluty. Podział ten realizowany był w postaci następujących statycznych stron: 15

notowania ciągłe: http://gielda.onet.pl/indeksy-i-akcje,18633,100,0,notowania-gpw-start, notowania jednolite: http://gielda.onet.pl/akcje,18633,201,0,notowania-gpw-jednolite, notowania New Connect: http://gielda.onet.pl/indeksy-i-akcje,18635,300,0,notowania-newconnect-start, surowce: http://gielda.onet.pl/surowce,41922,430,0,notowania-surowce http://gielda.onet.pl/towary,47938,440,0,notowania-towary, waluty: http://waluty.onet.pl/notowania-walut-on-line-forex,18906,notowania-online. Powyższe strony aktualizowane były informacjami z GPW co 15 minut zgodnie z przedstawionym wcześniej harmonogramem uwzględniającym 15 minutowe opóźnienie początkowe dla użytkowników niekomercyjnych. Dostosowano do tego proces pobierania danych, przyjmując dodatkowe 5 minut opóźnienia początkowego, tak aby mieć pewność, że dane strony zawierają zaktualizowane dane. Szczegółowy harmonogram procesu pobierania notowań przedstawia Rys 6. Rys 6. Harmonogram pobierania danych giełdowych Pobieranie notowań giełdowych, ich aktualizacja, archiwizacja i synchronizacja zapewniające rozgrywkę z rzeczywistymi danymi giełdowymi zostały podzielone w aplikacji na 4 odpowiedzialne za ich realizację moduły: StockQuotesParser moduł parsujący dane giełdowe, InstrumentsUpdater moduł aktualizujący dane giełdowe, InstrumentsSynchroznier moduł synchronizujący historię notowań, InstrumentsTrigger moduł wyzwalający (triggerujący) poszczególne aktualizacje danych giełdowych. 16

6.2. Parsowanie Parsowanie, będące pierwszym etapem w procesie zapewniania rzeczywistych danych giełdowych w aplikacji, realizowane jest przez moduł StockQuotesParser. Moduł ten zawiera listę adresów stron internetowych, które mają zostać sparsowane oraz listy aktualnych notowań, które uzupełnia w miarę parsowania i uzyskiwania kolejnych wartości notowań ze stron. Listy te przedstawia Listing 2. public List<string> UriList; // lista uri z adresami stron do parsowania danych public List<Instrument> ContinuousIndexesList; // notowania ciągłe - indeksy public List<Instrument> ContinuousInstrumentsList; // notowania ciągłe - akcje public List<Instrument> UniformInstrumentsList; // notowania jednolite - akcje public List<Instrument> NewConnectInstrumentsList;// notowania New Connect - akcje public List<Instrument> NewConnectIndexesList; // notowania New Connect - indeksy public List<Material> MaterialsList; // surowce public List<Currency> CurrenciesList; // waluty Listing 2. Listy notowań oraz adresów URL przechowywane przez StockQuotesParser Proces parsowania przeprowadzany przez StockQuotesParser rozpoczyna się po wywołaniu metody Parse().Następuje w niej stworzenie obiektu klasy WebClient, umożliwiającej odbieranie i przesyłanie danych ze źródła określonego adresem URI. Ustawiane jest odpowiednie kodowanie i wywoływany za pomocą metody DownloadString()z podanym odpowiednim adresem strony internetowej, proces pobierania jej źródła do obiektu typu string. Tak pobrane źródło strony jest następnie parsowane poprzez wywołanie odpowiedniej metody parsującej - adekwatnej do źródła, które zostało pobrane (w przypadku Listingu 3. jest to parsowanie notowań ciągłych). W metodzie parsującej następuje obróbka pobranej strony i wyłowienie z tekstu za pomocą wyszukiwania odpowiednich znaczników aktualnych wartości notowań. Znaleziona aktualna wartość jest umieszczana w odpowiedniej liście notowań. Jeżeli podczas parsowania wystąpił błąd wszystkie listy zostają wyczyszczone tak aby nie wprowadzać do aplikacji niepełnych bądź nieprawidłowych danych. Proces pobierania źródeł stron i wywoływania poszczególnych metod parsujących powtarzany jest dla wszystkich grup notowań, a po jego poprawnym przeprowadzeniu StockQuotesParser zawiera listy aktualnych notowań giełdowych. public int Parse() WebClient client = new WebClient(); try /* notowania ciągłe */ client.encoding = System.Text.UTF8Encoding.UTF8; string result = client.downloadstring(urilist[0]); int value = ParsingAlgorithmForContinuousInstrumentsAndNewConnect(result, false); if (value == -1 value == 0) 17

ContinuousIndexesList.Clear(); ContinuousInstrumentsList.Clear(); UniformInstrumentsList.Clear(); NewConnectInstrumentsList.Clear(); NewConnectIndexesList.Clear(); MaterialsList.Clear(); CurrenciesList.Clear(); return value; Listing 3. Parsowanie danych giełdowych W przypadku modułu parsującego warto także wspomnieć o metodzie odpowiedzialnej za parsowanie notowań jednolitych. Notowania te są aktualizowane na GPW dwa razy dziennie (fixing pierwszy i drugi). Dostosowany jest do tego również proces parsowania, który wywołując metodę TimeCounterForParsing(), sprawdzającą czy aktualny czas jest odpowiedni do pobrania pierwszego bądź drugiego fixingu czy też może aktualizacja nie musi być wykonywana, daje informacje o tym czy parsowanie ma zostać wywołane i jakie ma ono ewentualnie być. Dzięki temu aplikacja nie jest obciążana poprzez zbędne parsowania, a aktualne dane znajdujące się w aplikacji nie są zbędnie nadpisywane tymi samymi wartościami. Przebieg procesu wyboru parsowania dla notowań jednolitych przedstawia Listing 4. int decision = TimeCounterForParsing(DateTime.Now); int stateofmethod = 0; // czy poprawnie przeprowadzono operację switch(decision) case 0: break; case 1: stateofmethod = ParseFirstFix(result); break; ; case 2: stateofmethod = ParseSecondFix(result); break; Listing 4. Przebieg procesu wyboru parsowania dla notowań jednolitych 6.3. Aktualizacja Proces aktualizacji danych giełdowych przeprowadzany jest za pomocą modułu InstrumentsUpdater. Moduł ten posiada instancję klasy StockQuotesParser, dzięki której może wywoływać bezpośrednio proces parsowania, a także instancję StockSharkDB dzięki której, poprzez Entity Framework, możliwa jest aktualizacja bazy danych. 18

Proces aktualizacji danych giełdowych uruchamiany jest poprzez wywołanie metody Update(). W metodzie tej sprawdzane jest na początku czy giełda jest otwarta. Jest to ważne, gdyż w przypadku zamkniętej giełdy dane nie muszą być aktualizowane. Proces sprawdzania statusu giełdy wykonywany jest w metodzie statycznej MarketOpen() z klasy GameProperties. Sprawdzaniu podlega godzina (8.30-17.30) oraz dzień tygodnia (poniedziałek - piątek) w których giełda jest otwarta. W przypadku uzyskania pozytywnej informacji giełda otwarta, przeprowadzany jest proces parsowania. Wypełnione dzięki parsowaniu listy aktualnych notowań są następnie wykorzystywane do aktualizacji danych zawartych w bazie. Proces ten polega na wywoływaniu kolejnych metod aktualizujących poszczególne grupy notowań, gdzie przykładem może być aktualizacja indeksów notowań ciągłych. W metodzie aktualizującej te notowania na początku pobierane są z bazy wszystkie walory przypisane do giełdy GPW Rynek Główny. Następnie po typach walorów odfiltrowywane są indeksy i następuje ich porównywanie z tym co znajduje się w liście aktualnych wartości indeksów notowań ciągłych uzyskanej z parsowania. Jeśli wartości w bazie i w aktualnych indeksach są różne dane aktualne przepisywane są do listy indeksów z bazy. Po sprawdzeniu wszystkich elementów z bazy następuje zapis zmian i metoda kończy swoje działanie. W przypadku błędów w odczycie danych bądź braku połączenia z bazą danych proces aktualizacji nie jest przeprowadzany, a metoda aktualizująca zwraca odpowiedni komunikat błędu. Proces aktualizacji indeksów notowań ciągłych przedstawia Listing 5. public int UpdateContinuousIndexes() int result = 0; // wynik działania metody IEnumerable<Instrument> continuousindexestmp = from index in db.instruments Where index.market.equals("gpw Rynek Główny") select index; List<Index> indexeslst = new List<Index>(); foreach (var item in continuousindexestmp) if (item.gettype() == typeof(index)) indexeslst.add((index)item); /* brak połączenia z bazą danych */ if (indexeslst.count == 0) return -1; foreach (Instrument item in Parser.ContinuousIndexesList) foreach (Index instr in indexeslst) if (instr.name.equals(item.name)) if (instr.currentprice!= item.currentprice) 19

instr.currentprice = item.currentprice; db.entry(instr).state = System.Data.EntityState.Modified; result = 1; indexeslst.remove(instr); break; if (result == 1) db.savechanges(); return result; Listing 5. Aktualizacja indeksów notowań ciągłych Po przeprowadzeniu wszystkich aktualizacji następuje proces wykonania oczekujących transakcji za pomocą statycznej metody ExecuteTransactions() z klasy TradeCenter. Po nim metoda Update() kończy swoje działanie. 6.4. Historia notowań Ważnym aspektem w przypadku aktualizacji notowań giełdowych jest archiwizowanie ich wartości z poszczególnych dni. Dzięki temu użytkownik posiada informację o tym jak notowania się zmieniały i może łatwiej przewidzieć przyszły kurs danego waloru. Historia notowań obsługiwana jest przez moduł InstrumentsSynchroznier i zapisywana w specjalnie przygotowanej do tego celu tabeli Quotations. Proces przeprowadzany jest poprzez wywołanie metody Synchronize(). W metodzie tej sprawdzana jest początkowo poprawność połączenia z bazą danych, a następnie wywoływane są metody pomocnicze IsSynchronizingNeeded() i IsTimeForSynchronizing().IsSynchronizingNeeded() sprawdza ostatnie wpisy w tabeli Quotations i jeśli są one z bieżącego dnia to aktualizacja historii nie jest wymagana. IsTimeForSynchronizing() z kolei sprawdza aktualny czas systemowy i gdy mieści się on w granicach przyjętych dla aktualizacji historii, a więc między 23:30 a 23:59 to przekazywana jest informacja o tym, że aktualizacja może zostać wykonana. Obie metody pomocnicze muszą potwierdzić potrzebę aktualizacji historii i możliwość jej wykonania aby proces ten mógł zostać wykonany. Aktualizacja przeprowadzana jest dla wszystkich notowań, zamówień oraz kont maklerskich poprzez wywołanie z poziomu metody Update () metod SynchronizeInstruments(), SynchronizeOrders() i SynchronizeBrokerageAccounts(). W przypadku notowań aktualizacja dokonywana jest w dni, w które giełda jest otwarta (wspomniana wcześniej statyczna metoda MarketOpen() z klasy GameProperties). Pobierane są z bazy wszystkie aktualne notowania, a następnie dla każdego z nich aktualna cena przepisywana jest do ceny odniesienia, a później zerowana. Dane tak zaktualizowanego notowania służą do stworzenia nowego wpisu w 20

tabeli Quotations. Po tych aktualizacjach zmodyfikowane oraz nowowprowadzone dane są zapisywane do bazy. Proces aktualizacji historii notowań przedstawiony jest na Listingu 6. public int SynchronizeInstruments() try IEnumerable<Instrument> instruments = from instr in db.instruments select instr; if (instruments.first<instrument>() == null) return -1; foreach (Instrument item in instruments) item.referenceprice = item.currentprice; item.currentprice = 0; db.quotations.add(new Quotation Paper = item, PaperId = item.id, Timestamp = DateTime.Now.Date, Value = item.referenceprice ); db.entry(item).state = System.Data.EntityState.Modified; return 1; catch return -1; Listing 6. Aktualizacja historii notowań Kolejną z aktualizacji jest aktualizacja zamówień polegająca na pobraniu z bazy wszystkich zamówień oraz usunięciu tych, których czas końcowy na realizację (Deadline) przekroczył bieżącą datę bądź jest jej równy. Aktualizacja wartości kont maklerskich to ostatnia z wykonywanych przez InstrumentsSynchroznier aktualizacji danych. W metodzie SynchronizeBrokerageAccounts() pobierane są wszystkie konta maklerskie, a następnie tworzona jest ich nowa całkowita wartość (TotalValue) poprzez zsumowanie wszystkich wartości walorów jakie posiada dane konto. Na tej podstawie tworzony jest także nowy wpis w tabeli AccountValues, dzięki której można uzyskać informację o aktualnych wartościach poszczególnych kont. Dokładny przebieg aktualizacji wartości kont maklerskich przedstawia Listing 7. public int SynchronizeBrokerageAccounts() try IEnumerable<BrokerageAccount> bas = from ba in db.brokerageaccounts select ba; if (bas.first<brokerageaccount>() == null) 21

return -1; foreach (BrokerageAccount ba in bas) ba.totalvalue = ba.balance; foreach (OwnedInstrument oi in ba.ownedinstruments) ba.totalvalue += oi.totalvalue; db.accountvalues.add(new AccountValue() BrokerageAccount = ba, Timestamp = DateTime.Now.Date, Value = ba.totalvalue ); return 1; catch return -1; Listing 7. Aktualizacja wartości kont maklerskich Po przeprowadzeniu powyższych aktualizacji metoda Synchronize()kończy swoje działanie. 6.5. Triggerowanie Ostatnim z etapów zapewniania rzeczywistych danych giełdowych w aplikacji jest proces triggerowania stworzonych modułów parsowania, aktualizacji kont i historii notowań. Na poczet tego procesu stworzony został moduł InstrumentsTrigger. Ideą tego modułu jest wywołanie przy starcie aplikacji wątku pracującego w tle i wykonującego w odpowiednim czasie poszczególne aktualizacje. InstrumentsTrigger posiada instancję opisanych wcześniej klas InstrumentsUpdater, InstrumentsSynchroznier oraz klasę Thread dzięki której możliwe jest stworzenie wątku. Wątek tworzony jest w metodzie Start(), gdzie następuje przypisanie do niego delegatu odpowiedzialnego za logikę biznesową procesu triggerowania. Delegat ten zostanie uruchomiony w momencie uruchomienia wątku (wywołanie metody Start() na rzecz obiektu Thread). Wątek działa przez cały czas działania aplikacji i zabijany jest gdy aplikacja zostanie wyłączona. Proces tworzenia wątku w metodzie Start() przedstawia Listing 8. public void Start() ThreadStart wstart = new ThreadStart(Actualize); Thread = new Thread(wstart); Thread.Start(); Listing 8. Tworzenie wątku triggerującego aktualizację danych 22

Logika biznesowa triggerowania powiązana jest ściśle z harmonogramem aktualizacji. W godzinach od 8:50 do 17:50 następuje parsowanie i aktualizacja notowań giełdowych (wywołanie metody Update() na rzecz obiektu Updater) po której wątek jest na 15 minut usypiany. Po 15 minutach wątek budzi się i znów aktualizuje dane. Gdy bieżący czas jest pomiędzy 23:30 a 23:50 następuje uruchomienie aktualizacji historii, zamówień oraz kont maklerskich. Po tej akcji wątek usypiany jest na 8 godzin i budzi się następnego dnia w okolicach godziny 8 oczekując na start sesji giełdowej. Podczas oczekiwania, wątek na minutę jest usypiany jeżeli sesja jeszcze się nie rozpoczęła. Dzięki temu nie odpytuje on ciągle aplikacji i zmniejsza tym samym obciążenia przez nią generowane. Proces wywoływania poszczególnych aktualizacji przedstawia Listing 9. public void Actualize() while (true) do Updater.Update(); // uśpienie wątku na 15 min Thread.Sleep(900000); while((datetime.now.hour == 8 && DateTime.Now.Minute >= 50) (DateTime.Now.Hour > 8 && DateTime.Now.Hour < 17 ) (DateTime.Now.Hour == 17 && DateTime.Now.Minute <= 50)); if (DateTime.Now.Hour == 23 && && (DateTime.Now.Minute == 30 DateTime.Now.Minute == 50 (DateTime.Now.Minute > 30 DateTime.Now.Minute < 50))) Synchronizer.Synchronize(); // uśpienie wątku na 8h Thread.Sleep(28800000); // uśpienie wątku na minutę Thread.Sleep(60000); Listing 9. Triggerowanie aktualizacji 23

7. Testy Jeden z najważniejszych aspektów tworzenia oprogramowania, zapewniający nie tylko jakość oprogramowania, ale pozwalający także na weryfikację oraz walidację, a więc sprawdzenie, czy wytwarzane oprogramowanie jest zgodne ze specyfikacją i z oczekiwaniami użytkownika. Testowanie pozwala także na łatwość utrzymywania istniejącej aplikacji, rozbudowę funkcjonujących już komponentów bądź też dodawanie nowych funkcjonalności. W stworzonej aplikacji część funkcjonalności (moduły StockQuotesParser, InstrumentsUpdater, InstrumentsSynchroznier i InstrumentsTrigger) zaimplementowano techniką Test Driven Development, opartą na tworzeniu oprogramowania poprzez testy. Dzięki pisaniu kolejnych testów, których następstwem był w pełni działający kod uzyskano nie tylko zgodne ze specyfikacją oraz oczekiwaniami użytkownika, dobre jakościowo i w pełni zrefaktoryzowane oprogramowanie, ale także szereg sprawdzających je testów jednostkowych (dla 4 modułów łącznie 93 testy). Jest to nieodzowne w przypadku utrzymywania i rozwijania tak dużej aplikacji. Ponadto w przypadku błędów związanych z czynnikami zewnętrznymi (układ i struktura stron internetowych udostępniających notowania giełdowe) niepotrzebne jest przeszukiwanie całej aplikacji - wystarczy jedynie sprawdzić, który test nie został poprawnie wykonany, co jednoznacznie zlokalizuje przyczynę błędów. Rysunek 7. Wynik przeprowadzonych testów jednostkowych W aplikacji, której używać by miało jednocześnie wielu użytkowników, oprócz testów jednostkowych ważne są również testy związane z optymalnością działania aplikacji, a więc testy obciążenia, testy maksymalnego obciążenia oraz testy wydajnościowe. Testy obciążenia sprawdzają, czy aplikacja jest w stanie obsłużyć wskazaną liczbę użytkowników (zadaniem programisty jest zatem zasymulowanie odpowiedniego ruchu), testy maksymalnego obciążenia mają za zadanie wyznaczyć maksymalne możliwości aplikacji (wykonywane podobnie jak testy obciążenia, z tym że symulowany jest ruch z wyższą częstotliwością, tester zwiększa liczbę użytkowników aż do momentu, gdy aplikacja przestanie prawidłowo działać np. zawiesi się z powodu wyczerpania zasobów) oraz testy wydajnościowe weryfikujące, czy podana operacja jest wykonana we wskazanym czasie. Microsoft Visual Studio 2010 w wersji Ultimate posiada dodatki służące tworzeniu tego typu testów (Load Test 24