{"id":6355,"date":"2020-04-17T01:04:29","date_gmt":"2020-04-16T23:04:29","guid":{"rendered":"https:\/\/infoshareacademy.com\/?p=6355"},"modified":"2021-01-12T08:56:19","modified_gmt":"2021-01-12T07:56:19","slug":"testowanie-w-c-i-net-core","status":"publish","type":"post","link":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/","title":{"rendered":"Testowanie w C# i .NET Core"},"content":{"rendered":"<p>O jak wielu rodzajach test\u00f3w s\u0142ysza\u0142e\u015b? Testy jednostkowe, integracyjne, end-to-end, smoke testy, testy manualne &#8211; tak\u0105 list\u0119 mo\u017cna ci\u0105gn\u0105\u0107 jeszcze d\u0142ugo. W tym artykule skoncentrujemy si\u0119 tylko na ich ma\u0142ym wycinku, jakim jest testowanie w C# i .NET Core. Om\u00f3wimy bardzo popularne mechanizmy jak testy jednostkowe i BDD. Oczywi\u015bcie, to nie wszystko! Zajmiemy si\u0119 r\u00f3wnie\u017c bardzo ciekawym podej\u015bciem, niestety niezbyt rozpowszechnionym, czyli testami mutacyjnymi.<\/p>\n<h2 class=\"blog-h2\">U\u017cywane biblioteki<\/h2>\n<p>Oczywi\u015bcie, b\u0119dziemy pisa\u0107 kod! W tym celu skorzystamy z C# i <a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet-core\">.Net Core&#8217;a<\/a> w wersji 3.1 Dlaczego .Net Core? Poniewa\u017c w tej chwili to jeden z najdynamiczniej rozwijaj\u0105cych si\u0119 framework\u00f3w. Na dodatek, zgodnie z <a href=\"https:\/\/insights.stackoverflow.com\/survey\/2019#technology-_-most-loved-dreaded-and-wanted-other-frameworks-libraries-and-tools\">raportem StackOverflow<\/a>, jest r\u00f3wnie\u017c bardzo lubiany w\u015br\u00f3d developer\u00f3w. Do test\u00f3w jednostkowych u\u017cyjemy <a href=\"https:\/\/github.com\/xunit\/xunit\">xUnit<\/a> i Fluent <a href=\"https:\/\/github.com\/fluentassertions\/fluentassertions\">Assertions<\/a>, a przy BDD dodatkowo wspomo\u017ce nas <a href=\"https:\/\/github.com\/ChillBDD\/Chill\">ChillBDD<\/a>. Testy mutacyjne poznamy z wykorzystaniem <a href=\"https:\/\/github.com\/stryker-mutator\/stryker-net\">Stryker .Net<\/a>.<\/p>\n<h2 class=\"blog-h2\">Regu\u0142y biznesowe<\/h2>\n<p>\u017badne testy nie maj\u0105 sensu, je\u017celi nie weryfikuj\u0105 jakiego\u015b systemu. Naszym kodem produkcyjnym b\u0119dzie maszyna z przek\u0105skami, czyli klasyczna TDD Kata.<\/p>\n<p>Jak dzia\u0142a nasz automat? Dzisiaj zajmiemy si\u0119 tylko cz\u0119\u015bci\u0105 jego funkcji. B\u0119dziemy weryfikowa\u0107 dwie rzeczy:<\/p>\n<ul>\n<li class=\"blog_li\">wrzucamy do niego pieni\u0105dze i mo\u017cemy poprosi\u0107 o ich zwrot<\/li>\n<li class=\"blog_li\">kupujemy produkt i otrzymujemy reszt\u0119<\/li>\n<\/ul>\n<p>Rozszerzon\u0105 wersj\u0119, wraz ze 100% pokryciem testami, znajdziesz na <a href=\"https:\/\/github.com\/jciechowski\/VendingMachineTDDKata\">githubie<\/a>.<\/p>\n<h2 class=\"blog-h2\">Testy, testy i jeszcze wi\u0119cej test\u00f3w<\/h2>\n<h3 class=\"blog-h3\">Testy jednostkowe<\/h3>\n<p>Znaj\u0105c wymagania, mo\u017cemy zaj\u0105\u0107 si\u0119 testami. Zaczniemy od najmniej skomplikowanego podej\u015bcia, czyli test\u00f3w jednostkowych.<br>W tej cz\u0119\u015bci b\u0119dziemy weryfikowa\u0107 zachowanie pojedynczych metod klasy VendingMachine.<\/p>\n<p>Naszym pierwszym testem b\u0119dzie sprawdzenie, czy mo\u017cemy otrzyma\u0107 z powrotem wrzucon\u0105 kwot\u0119:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">[Theory]\n[InlineData(\"1, 1, 1\", \"1, 1, 1\")]\n[InlineData(\"0.25, 0.25, 0.25, 0.25\", \"0.25, 0.25, 0.25, 0.25\")]\npublic void ReturnsAllInsertedCoins(string insertedCoins, string expected)\n{\n    var vendingMachine = new VendingMachine();\n    vendingMachine.InsertMoney(insertedCoins);\n\n    var returnedCoins = vendingMachine.Return();\n\n    returnedCoins.Should().Be(expected);\n}<\/pre>\n<p>Na co warto zwr\u00f3ci\u0107 uwag\u0119 w tym fragmencie kodu?<br>Na pewno na atrybut <i>[InlineData]<\/i>, kt\u00f3ry pozwala przekaza\u0107 nam parametry do testu. Korzystaj\u0105c z niego, definiujemy warto\u015b\u0107 monet wrzuconych do maszyny (parametr <i>insertedCoins<\/i>) oraz oczekiwany rezultat (parametr <i>expected<\/i>).<br>Nast\u0119pnie tworzymy instancj\u0119 klasy, kt\u00f3r\u0105 testujemy i wywo\u0142ujemy na niej odpowiednie metody.<br>Na koniec, korzystaj\u0105c z FluentAssertions, weryfikujemy rezultat.<br>W tym stylu b\u0119d\u0105 utrzymane pozosta\u0142e testy jednostkowe, kt\u00f3re mo\u017cesz zobaczy\u0107 <a href=\"https:\/\/github.com\/jciechowski\/VendingMachineTDDKata\/tree\/master\/VendingMachineKata.Tests\">TUTAJ<\/a>.<\/p>\n<h3 class=\"blog-h3\">Testy BDD<\/h3>\n<p>Przysz\u0142a pora na testy BDD, czyli Behavior Driven Development. Czym r\u00f3\u017cni\u0105 si\u0119 one od test\u00f3w jednostkowych? Przede wszystkim, zmieniamy podej\u015bcie. W tym przypadku, spr\u00f3bujemy od razu zdefiniowa\u0107 ko\u0144cowy scenariusz. Takie scenariusze b\u0119d\u0105 &#8222;m\u00f3wi\u0107 w j\u0119zyku biznesu&#8221;. To znaczy, \u017ce zamiast weryfikowa\u0107 konkretne metody, spr\u00f3bujemy zapisa\u0107 nasz test w j\u0119zyku zbli\u017conym do naturalnego. Jak wygl\u0105da to w \u201c\u017cywym\u201d kodzie?<br>Na przyk\u0142ad, w ten spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">namespace BDDTests\n{\n    namespace ForBuyingProductsWithChange\n    {\n        public class WhenInsertedMoreMoneyThanPriceOfProduct \n               : GivenSubject&lt;VendingMachine, string&gt;\n        {\n            public WhenInsertedMoreMoneyThanPriceOfProduct()\n            {\n                Given(() =&gt; Subject.InsertMoney(\"1, 0.50\"));\n\n                When(() =&gt; Subject.GetCola());\n            }\n\n            [Fact]\n            public void ThenGetColaWithChange()\n            {\n                Result.Should().ContainAll(\"Cola\", \"0.50\");\n            }\n        }\n    }\n}\n<\/pre>\n<p>Jak wida\u0107, dzieje si\u0119 tutaj du\u017co wi\u0119cej, ni\u017c we wcze\u015bniejszym przyk\u0142adzie. Spraw\u0119 komplikuje r\u00f3wnie\u017c to, \u017ce korzystamy z biblioteki <i>ChillBDD<\/i>.<br>Zacznijmy od dw\u00f3ch <i>namespace&#8217;\u00f3w<\/i>, kt\u00f3re pozwalaj\u0105 nam dok\u0142adniej opisa\u0107, co dzieje si\u0119 w samym te\u015bcie.<br>Zwr\u00f3\u0107 uwag\u0119 na dziedziczenie po generycznej klasie <i>GivenSubject&lt;vendingmachine, string=&#8221;&#8221;&gt;&lt;\/vendingmachine,&gt;<\/i>. Dzi\u0119ki temu korzystamy z w\u0142a\u015bciwo\u015bci <i>Subject<\/i>, kt\u00f3ra jest instancj\u0105 klasy <i>VendingMachine<\/i> oraz z w\u0142a\u015bciwo\u015bci <i>Result<\/i>, kt\u00f3ra jest typu <i>string<\/i> i oczywi\u015bcie, zawiera rezultat. Ok, wszystko pi\u0119knie, ale rezultat czego? I tutaj znowu musimy odwo\u0142a\u0107 si\u0119 do <i>Chill<\/i>. Zapewne zauwa\u017cy\u0142a\u015b lub zauwa\u017cy\u0142e\u015b dwie lambdy w konstruktorze &#8211; <i>Given<\/i> oraz When.<br>To w\u0142a\u015bnie w tym miejscu przygotowujemy dane i wywo\u0142ujemy metod\u0119, kt\u00f3rej rezultat weryfikujemy. When(() =&gt; Subject.GetCola()); przypisuje do w\u0142a\u015bciwo\u015bci Result wynik metody GetCola().<br>Dzi\u0119ki temu, mo\u017cemy opisa\u0107 nasz test, korzystaj\u0105c ze schematu Given &#8211; When &#8211; Then, gdzie Then jest po prostu weryfikacj\u0105 wyniku.<\/p>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\">Szukasz szkolenia dla siebie lub swojego teamu?<br><a href=\"https:\/\/szkoleniazdalne.infoshareacademy.com\">Sprawd\u017a nasze zdalne szkolenia dla firm z trenerem NA \u017bYWO<\/a><\/span><\/div>\n<h3 class=\"blog-h3\">Testy mutacyjne<\/h3>\n<p>Na koniec zupe\u0142nie zmienimy nasz punkt widzenia. Co ciekawe, tym razem nie napiszemy ani linijki kodu! Skorzystamy natomiast z test\u00f3w mutacyjnych i biblioteki Stryker .Net.<\/p>\n<p>Czym charakteryzuje si\u0119 ten rodzaj test\u00f3w? Przede wszystkim, w ten spos\u00f3b b\u0119dziemy weryfikowa\u0107 jako\u015b\u0107 do tej pory napisanych test\u00f3w.<\/p>\n<p>Ca\u0142y proces sk\u0142ada si\u0119 z trzech cz\u0119\u015bci:<\/p>\n<p>1. Stryker .Net wprowadzi do naszego kodu mutanty. Czym s\u0105 mutanty? To nic innego jak zmiany w naszym kodzie. Mog\u0105 to by\u0107 zar\u00f3wno zmiany operatora z &gt; na &lt;, zanegowanie warto\u015bci typu bool, jak i zamiana stringa. Po list\u0119 wszystkich dost\u0119pnych mutacji zapraszam do <a href=\"https:\/\/github.com\/stryker-mutator\/stryker-net\/blob\/master\/docs\/Mutators.md\">dokumentacji<\/a>.<\/p>\n<p>2. W nast\u0119pnym kroku, dla ka\u017cdego wprowadzonego mutanta, Stryker uruchomi nasze testy.<\/p>\n<p>3. Na koniec procesu otrzymamy raport w formacie html, kt\u00f3ry powie nam, kt\u00f3re mutanty prze\u017cy\u0142y, a kt\u00f3re zosta\u0142y wychwycone przez nasze testy. Mutant, kt\u00f3ry prze\u017cy\u0142 to taka zmiana, kt\u00f3ra nie zepsu\u0142a \u017cadnego z naszych test\u00f3w.<\/p>\n<p>Jakie wnioski mo\u017cemy wyci\u0105gn\u0105\u0107 z tej procedury? Oczywi\u015bcie, szukamy mutant\u00f3w, kt\u00f3re prze\u017cy\u0142y. Je\u017celi zmiana w kodzie nie zepsu\u0142a chocia\u017c jednego testu, to powinna zapali\u0107 si\u0119 nam czerwona lampka. Skoro mo\u017cemy dowolnie zmienia\u0107 kod, a nasze testy nie s\u0105 w stanie tego wychwyci\u0107, to jako\u015b\u0107 naszych test\u00f3w nie jest najwy\u017csza.<\/p>\n<p>Sprawd\u017amy, jak zachowaj\u0105 si\u0119 nasze testy w starciu z mutantami.<\/p>\n<p>W odr\u00f3\u017cnieniu od poprzednich bibliotek, kt\u00f3re mo\u017cemy zainstalowa\u0107 przez Nuget, Stryker .Net instalujemy r\u0119cznie.<br>Je\u017celi masz zainstalowane .Net Core SDK w wersji wy\u017cszej ni\u017c 2.1 to z linii polece\u0144 wystarczy wywo\u0142a\u0107 instrukcj\u0119:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">dotnet tool install -g dotnet-stryker<\/code><\/p>\n<p>Nast\u0119pnie, z katalogu z testami, uruchamiamy bibliotek\u0119:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">dotnet stryker --reporters \"['html', 'progress']\"<\/code><\/p>\n<p>Po oko\u0142o minucie powinni\u015bmy zobaczy\u0107 rezultat oraz \u015bcie\u017ck\u0119 do pliku z raportem.<br>Jego fragment wygl\u0105da w ten spos\u00f3b:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-3000\" src=\"https:\/\/infoshareacademy.com\/wp-content\/uploads\/2020\/04\/wycinek.png\" alt=\"screen\"><\/figure>\n<p>Jest to cz\u0119\u015b\u0107 metody <a href=\"https:\/\/github.com\/jciechowski\/VendingMachineTDDKata\/blob\/master\/VendingMachineKata\/VendingMachine.cs#L53\">GetProductWithChange<\/a>, z zaznaczonymi mutantami. Zwr\u00f3\u0107 uwag\u0119 na numer 20 i zmian\u0119, kt\u00f3r\u0105 wprowadzi\u0142 Stryker. Po wprowadzeniu mutanta, kt\u00f3ry zwi\u0119ksza\u0142 ilo\u015b\u0107 produkt\u00f3w po zakupie, nasze testy dalej przechodzi\u0142y. Taka zmiana bardzo szybko doprowadzi do problem\u00f3w poniewa\u017c b\u0119dziemy pr\u00f3bowali sprzeda\u0107 produkt, kt\u00f3rego nie mamy w maszynie.<\/p>\n<p>Jak powinien wygl\u0105da\u0107 test, kt\u00f3ry wychwyci tak\u0105 zmian\u0119? Oczywi\u015bcie, powinien on sprawdza\u0107 czy ilo\u015b\u0107 produkt\u00f3w zosta\u0142a zmniejszona po jego zakupie. Spr\u00f3buj naprawi\u0107 ten problem w ramach treningu.<\/p>\n<h2 class=\"blog-h2\">Kiedy stosowa\u0107 dany typ test\u00f3w<\/h2>\n<p>Wiedz\u0105c ju\u017c, jak wygl\u0105da nasz ma\u0142y wycinek \u015bwiata test\u00f3w, zastan\u00f3wmy si\u0119, kiedy stosowa\u0107 konkretne rodzaje test\u00f3w.<\/p>\n<p><b>Testy jednostkowe<\/b> zazwyczaj przynosz\u0105 najwi\u0119cej korzy\u015bci, kiedy weryfikujemy jaki\u015b ma\u0142y, niezale\u017cny wycinek systemu. Czym jest ma\u0142y i niezale\u017cny wycinek? To pytanie jest tematem nieko\u0144cz\u0105cych si\u0119 spor\u00f3w i internetowych wojen. Najprostszym za\u0142o\u017ceniem jest testowanie pojedynczych klas i ich metod. I przy tej definicji zostaniemy.<\/p>\n<p>Takie testy jest stosunkowo \u0142atwo napisa\u0107, a uruchamiaj\u0105 si\u0119 bardzo szybko. W zwi\u0105zku z tym mo\u017cemy z nich korzysta\u0107 bardzo cz\u0119sto i na bie\u017c\u0105co sprawdza\u0107, czy niczego nie zepsuli\u015bmy.<\/p>\n<p><b>BDD<\/b> sprawdza si\u0119 na przyk\u0142ad przy tworzeniu kryteri\u00f3w akceptacyjnych. Konkretne wymagania mo\u017cemy zapisa\u0107 w formie kodu i zadanie uzna\u0107 za sko\u0144czone, kiedy nasz test przechodzi.<\/p>\n<p>Warto pami\u0119ta\u0107 o tym, \u017ce takie testy b\u0119d\u0105 cz\u0119\u015bci\u0105 kodu \u017ar\u00f3d\u0142owego naszej aplikacji. W zwi\u0105zku z tym przedyskutuj wcze\u015bniej z zespo\u0142em, czy planujecie takie testy tworzy\u0107 oraz jakich bibliotek do tego u\u017cyjecie.<\/p>\n<p><b>Testy mutacyjne<\/b> przydatne s\u0105 w ka\u017cdym momencie. Z racji tego, \u017ce bibliotek\u0119 do takich test\u00f3w mo\u017cemy zainstalowa\u0107 lokalnie i nie musimy w tej sprawie konsultowa\u0107 si\u0119 ze swoim zespo\u0142em. Jedynym wymogiem jest po prostu to, \u017ce piszecie testy. Je\u017celi nie macie \u017cadnych test\u00f3w w projekcie (co, niestety si\u0119 zdarza), to taka metoda weryfikacji nie b\u0119dzie mia\u0142a \u017cadnego sensu.<\/p>\n<h2 class=\"blog-h2\">Podsumowanie<\/h2>\n<p>Jak wida\u0107, \u015bwiat test\u00f3w jest niesamowicie bogaty, a zacz\u0105\u0107 jest bardzo \u0142atwo. Wystarczy podstawowa znajomo\u015b\u0107 j\u0119zyka programowania i kompatybilnej z nim biblioteki. Zazwyczaj, w komercyjnych projektach, b\u0119dzie ju\u017c do tego dost\u0119pna infrastruktura wi\u0119c nie trzeba si\u0119 b\u0119dzie troszczy\u0107 o wyb\u00f3r bibliotek oraz ich konfiguracj\u0119.<\/p>\n<p>Je\u017celi szukasz czego\u015b bardziej skomplikowanego, mo\u017cesz zapozna\u0107 si\u0119 tematem <a href=\"https:\/\/github.com\/jciechowski\/VendingMachineTDDKata\/tree\/master\/VendingMachineKata.PropertyTesting\">Property-Based testing<\/a> dla tej samej maszyny z przek\u0105skami.<\/p>\n<p><strong>Autor:<\/strong><br><strong><a href=\" https:=\">Jakub Ciechowski<\/a><\/strong><\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-3000\" src=\"https:\/\/infoshareacademy.com\/wp-content\/uploads\/2020\/04\/kuba-a-removebg-preview-e1587077774552.png\" alt=\"Jakub Ciechowski - autor wpisu\"><\/figure>\n<p>Programista C# w <a href=\"https:\/\/www.linkedin.com\/company\/aspire-systems\/\">Aspire Systems Poland<\/a>. Mi\u0142o\u015bnik DDD i \u015bcis\u0142ej wsp\u00f3\u0142pracy z biznesem. Wielki fan kawy, kt\u00f3ry nie wyobra\u017ca sobie dnia, bez dzbanka naparu z drippera.<\/p>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\">Przeczytaj tak\u017ce:<br><a href=\"https:\/\/infoshareacademy.com\/artykul\/klient-http-i-obsluga-api-czesc-i\/\">Klient HTTP i obs\u0142uga API<\/a><\/span><\/div>\n\n\n<p><\/p>\n\n\n<p><script type=\"text\/javascript\" src=\"https:\/\/app.getresponse.com\/view_webform_v2.js?u=SAZgM&amp;webforms_id=BecDY\" data-webform-id=\"BecDY\"><\/script><\/p>","protected":false},"excerpt":{"rendered":"<p>O jak wielu rodzajach test\u00f3w s\u0142ysza\u0142e\u015b? Testy jednostkowe, integracyjne, end-to-end, smoke testy, testy manualne &#8211; tak\u0105 list\u0119 mo\u017cna ci\u0105gn\u0105\u0107 jeszcze d\u0142ugo. W tym artykule skoncentrujemy si\u0119 tylko na ich ma\u0142ym wycinku, jakim jest testowanie w C# i .NET Core. Om\u00f3wimy bardzo popularne mechanizmy jak testy jednostkowe i BDD. Oczywi\u015bcie, to nie wszystko! Zajmiemy si\u0119 r\u00f3wnie\u017c &hellip;<\/p>\n","protected":false},"author":3,"featured_media":9808,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,42],"tags":[],"class_list":["post-6355","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykul","category-c-net"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Testowanie w C# i .NET Core | infoShare Academy<\/title>\n<meta name=\"description\" content=\"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testowanie w C# i .NET Core - Jakub Ciechowski\" \/>\n<meta property=\"og:description\" content=\"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\" \/>\n<meta property=\"og:site_name\" content=\"infoShare Academy Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infoshareacademy\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-16T23:04:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-12T07:56:19+00:00\" \/>\n<meta name=\"author\" content=\"stokarska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/04\/testowanie_wc_blog_fb_iSA-1024x538-1.png\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"stokarska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\"},\"author\":{\"name\":\"stokarska\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\"},\"headline\":\"Testowanie w C# i .NET Core\",\"datePublished\":\"2020-04-16T23:04:29+00:00\",\"dateModified\":\"2021-01-12T07:56:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\"},\"wordCount\":1405,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"articleSection\":[\"Artyku\u0142\",\"C# \/ .NET\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\",\"name\":\"Testowanie w C# i .NET Core | infoShare Academy\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\"},\"datePublished\":\"2020-04-16T23:04:29+00:00\",\"dateModified\":\"2021-01-12T07:56:19+00:00\",\"description\":\"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.\",\"breadcrumb\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/infoshareacademy.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Testowanie w C# i .NET Core\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"name\":\"infoShare Academy Blog\",\"description\":\"Strona o szkoleniach w IT\",\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\",\"name\":\"infoShare Academy\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"contentUrl\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"width\":1000,\"height\":1000,\"caption\":\"infoShare Academy\"},\"image\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infoshareacademy\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\",\"name\":\"stokarska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"caption\":\"stokarska\"},\"url\":\"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Testowanie w C# i .NET Core | infoShare Academy","description":"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/","og_locale":"pl_PL","og_type":"article","og_title":"Testowanie w C# i .NET Core - Jakub Ciechowski","og_description":"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.","og_url":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/","og_site_name":"infoShare Academy Blog","article_publisher":"https:\/\/www.facebook.com\/infoshareacademy","article_published_time":"2020-04-16T23:04:29+00:00","article_modified_time":"2021-01-12T07:56:19+00:00","author":"stokarska","twitter_card":"summary_large_image","twitter_image":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/04\/testowanie_wc_blog_fb_iSA-1024x538-1.png","twitter_misc":{"Napisane przez":"stokarska","Szacowany czas czytania":"7 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#article","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/"},"author":{"name":"stokarska","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb"},"headline":"Testowanie w C# i .NET Core","datePublished":"2020-04-16T23:04:29+00:00","dateModified":"2021-01-12T07:56:19+00:00","mainEntityOfPage":{"@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/"},"wordCount":1405,"commentCount":0,"publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"articleSection":["Artyku\u0142","C# \/ .NET"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/","url":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/","name":"Testowanie w C# i .NET Core | infoShare Academy","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/#website"},"datePublished":"2020-04-16T23:04:29+00:00","dateModified":"2021-01-12T07:56:19+00:00","description":"Jak wygl\u0105da Testowanie w C# i .NET Core? Om\u00f3wimy bardzo popularne mechanizmy test\u00f3w: testy jednostkowe i BDD. Zajmiemy si\u0119 r\u00f3wnie\u017c testami mutacyjnymi.","breadcrumb":{"@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/infoshareacademy.com\/blog\/testowanie-w-c-i-net-core\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/infoshareacademy.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Testowanie w C# i .NET Core"}]},{"@type":"WebSite","@id":"https:\/\/infoshareacademy.com\/blog\/#website","url":"https:\/\/infoshareacademy.com\/blog\/","name":"infoShare Academy Blog","description":"Strona o szkoleniach w IT","publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/infoshareacademy.com\/blog\/#organization","name":"infoShare Academy","url":"https:\/\/infoshareacademy.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","contentUrl":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","width":1000,"height":1000,"caption":"infoShare Academy"},"image":{"@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infoshareacademy"]},{"@type":"Person","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb","name":"stokarska","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","caption":"stokarska"},"url":"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/"}]}},"_links":{"self":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/6355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/comments?post=6355"}],"version-history":[{"count":1,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/6355\/revisions"}],"predecessor-version":[{"id":9809,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/6355\/revisions\/9809"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media\/9808"}],"wp:attachment":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media?parent=6355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/categories?post=6355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/tags?post=6355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}