{"id":905,"date":"2015-11-27T09:00:28","date_gmt":"2015-11-27T08:00:28","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=905"},"modified":"2023-02-01T14:36:44","modified_gmt":"2023-02-01T13:36:44","slug":"how-to-czyli-framework-white-dla-aplikacji-desktopowych-czesc-1","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/how-to-czyli-framework-white-dla-aplikacji-desktopowych-czesc-1\/","title":{"rendered":"How to: Czyli framework White dla aplikacji desktopowych &#8211; cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<p>White jest open source\u2019owym frameworkiem napisanym w C# wspieraj\u0105cym klient\u00f3w aplikacji wykorzystuj\u0105cych Win32, WinForm, WPF and SWT (Java). Bazuje na .NET oraz zapewnia sp\u00f3jne API ukrywaj\u0105ce z\u0142o\u017cono\u015b\u0107 biblioteki Microsoftu \u00ac UI Automation. W dzisiejszym artykule wykorzystamy White do napisania prostego testu systemowego kalkulatora.<br>Na pocz\u0105tku musimy doda\u0107 do projektu odpowiednie referencje. Bez nich nie b\u0119dziemy mogli skorzysta\u0107 z oferowanych przez White funkcji i w\u0142a\u015bciwo\u015bci. Pobieramy TestStack.White ze strony&nbsp;<a href=\"https:\/\/github.com\/TestStack\/White\" rel=\"nofollow\" >https:\/\/github.com\/TestStack\/White<\/a>&nbsp;. Dodatkowo, aby skorzysta\u0107 ze wszystkich w\u0142a\u015bciwo\u015bci .NETu dodamy bibliotek\u0119 Castle.Core dost\u0119pn\u0105 na stronie&nbsp;<a href=\"http:\/\/www.castleproject.org\/download\/\" rel=\"nofollow\" >http:\/\/www.castleproject.org\/download\/<\/a>&nbsp;. Po \u015bci\u0105gni\u0119ciu odpowiednich .dll trzeba doda\u0107 je do \u015bcie\u017cki&nbsp;<em>C:\\Users\\u\u017cytkownik\\\u015bcie\u017cka do projektu na dysku\\nazwa projektu\\bin\\Debug\\<\/em>. Kiedy oba pliki s\u0105 tam skopiowane nale\u017cy doda\u0107 do nich referencj\u0119 w Visual Studio. W tym celu klikamy prawym przyciskiem na&nbsp;<strong>References<\/strong>&nbsp;i wybieramy&nbsp;<strong>Add References\u2026<\/strong>&nbsp;. Przechodzimy do zak\u0142adki&nbsp;<strong>Browse<\/strong>, klikamy przycisk&nbsp;<strong>Browse<\/strong>&nbsp;i wskazujemy lokalizacj\u0119 bibliotek. Dodatkowo nale\u017cy doda\u0107 jeszcze dwa frameworki z zak\u0142adki Assemblies:&nbsp;<em><strong>UIAutomation Types<\/strong><\/em>&nbsp;(je\u015bli chcemy rozpoznawa\u0107 kontrolki po ich typie) oraz&nbsp;<em><strong>System.Configuration<\/strong><\/em>&nbsp;( poniewa\u017c b\u0119dziemy korzysta\u0107 z pliku konfiguracyjnego). Ostatnimi referencjami b\u0119d\u0105 rozszerzenia z zak\u0142adki Extensions :&nbsp;<strong>EnvDTE, EnvDTE100, EnvDTE80, EnvDTE90, EnvDTE90a<\/strong>. S\u0105 to dodatki zawieraj\u0105ce obiekty i elementy niezb\u0119dne dla&nbsp;<em>Automation Core<\/em>.<\/p>\n\n\n\n<p>Kiedy wszystkie niezb\u0119dne referencje zostan\u0105 dodane do projektu, nale\u017cy stworzy\u0107 plik konfiguracyjny, w kt\u00f3rym zamieszczone zostan\u0105 klucze i warto\u015bci parametr\u00f3w testu. Klikamy praw\u0105 mysz\u0105 na nazw\u0119 projektu, wybieramy\u00a0<em>Add<\/em>, a nast\u0119pnie\u00a0<em>New Item\u2026<\/em>\u00a0. Z okienka wybieramy pozycj\u0119\u00a0<em>Application Configuration File<\/em>. Nie zmieniamy nazwy pliku \u2013 pierwszy plik konfiguracyjny musi nosi\u0107 nazw\u0119\u00a0<em>App.config<\/em>. Otwieramy go i dodajemy sekcj\u0119&lt;appSettings> . W niej umieszczamy klucze i warto\u015bci dla naszego testu. Przyk\u0142ad poni\u017cej:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-2-1.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-2-1.png\" alt=\"Rys.1. Plik konfiguracyjny\" class=\"wp-image-19164\" width=\"511\" height=\"137\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-2-1.png 511w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-2-1-300x80.png 300w\" sizes=\"(max-width: 511px) 100vw, 511px\" \/><\/a><figcaption>Rys.1. Plik konfiguracyjny<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">TESTBASE<\/h2>\n\n\n\n<p>Kolejnym krokiem b\u0119dzie stworzenie klasy bazowej, odpowiedzialnej za uruchamianie i zamykanie aplikacji przed i po ka\u017cdym te\u015bcie. W tym celu dodajemy now\u0105 klas\u0119 i nazywamy j\u0105 dowolnie, np. TestBase.cs. Czynimy klas\u0119 publiczn\u0105 oraz dodajemy przed ni\u0105 adnotacj\u0119<em>\u00a0[TestClass]<\/em>\u00a0(linia 27). Tworzymy prywatne zmienne, kt\u00f3re wykorzystamy w metodach inicjalizuj\u0105cych i czyszcz\u0105cych. Tworzymy metod\u0119<em>\u00a0Initialize()<\/em>\u00a0i dodajemy przed ni\u0105 adnotacj\u0119\u00a0<em>[TestInitialize]<\/em>\u00a0(linia 42). Na pocz\u0105tku funkcji pobieramy z pliku konfiguracyjnego \u015bcie\u017ck\u0119 do aplikacji i nazw\u0119 okna g\u0142\u00f3wnego i przypisujemy do zmiennych globalnych. Uruchamiamy aplikacj\u0119 poleceniem<em>\u00a0Launch()<\/em>\u00a0(linia 49). Nast\u0119pnie pobieramy list\u0119 okien uruchomionych program\u00f3w i wyszukujemy nasz Kalkulator. Je\u015bli okno nie istnieje aplikacja wypisze na konsoli odpowiedni alert. Poni\u017cej znajduje si\u0119 opisywany fragment klasy:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-3-1.png\"><img decoding=\"async\" width=\"937\" height=\"543\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-3-1.png\" alt=\"Rys. 2. TestBase \u2013 metoda inicjalizuj\u0105ca\" class=\"wp-image-19166\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-3-1.png 937w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-3-1-300x174.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/art3-3-1-768x445.png 768w\" sizes=\"(max-width: 937px) 100vw, 937px\" \/><\/a><figcaption>Rys. 2. TestBase \u2013 metoda inicjalizuj\u0105ca<\/figcaption><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Chcesz lepiej zrozumie\u0107 aplikacje i systemy, kt\u00f3re testujesz? Do\u0142\u0105cz do ModernTester, poznaj najpotrzebniejsze narz\u0119dzia, frameworki oraz j\u0119zyki programowania i \u0107wicz na specjalnie przygotowanych \u015brodowiskach testowych:&nbsp;<a href=\"https:\/\/moderntester.sii.pl\/\" rel=\"nofollow\" >Platforma e-learningowa ModernTester<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;905&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 ( votes: 0)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;How to: Czyli framework White dla aplikacji desktopowych - cz\u0119\u015b\u0107 1&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>White jest open source\u2019owym frameworkiem napisanym w C# wspieraj\u0105cym klient\u00f3w aplikacji wykorzystuj\u0105cych Win32, WinForm, WPF and SWT (Java). Bazuje na &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/how-to-czyli-framework-white-dla-aplikacji-desktopowych-czesc-1\/\">Continued<\/a><\/p>\n","protected":false},"author":37,"featured_media":994,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[137,136,138,135,68],"class_list":["post-905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-app-config","tag-castle-core","tag-testbase","tag-teststack-white","tag-visual-studio-express"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/11\/ZDJ\u0118CIE_KOD_2.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/905"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=905"}],"version-history":[{"count":4,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/905\/revisions"}],"predecessor-version":[{"id":19169,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/905\/revisions\/19169"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/994"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}