W dzisiejszym świecie zaawansowanego rozwoju aplikacji webowych, najnowsze frameworki JavaScript, takie jak React, Angular czy Vue, stanowią kluczowe narzędzie do tworzenia nowoczesnych aplikacji frontendowych. Z kolei środowisko Node.js pozwala na budowanie aplikacji backendowych. Połączenie tych dwóch obszarów staje się niezbędne, a Visual Studio oferuje szereg narzędzi i funkcji, które upraszczają proces tworzenia, debugowania i zarządzania aplikacjami JavaScript. W tym rozdziale przyjrzymy się, jak efektywnie wykorzystać Visual Studio 2022 do pracy z Node.js i nowoczesnymi frameworkami JavaScript.
W Visual Studio 2022 wprowadzono nowy system projektów JavaScript, który pozwala na łatwe tworzenie aplikacji opartych na popularnych frameworkach, takich jak React, Angular czy Vue, oraz na integrację z backendem Node.js. System ten opiera się na plikach .esproj, które umożliwiają tworzenie samodzielnych aplikacji JavaScript. Dzięki wsparciu dla narzędzi CLI poszczególnych frameworków, takich jak Angular CLI czy React CLI, możemy wygodnie tworzyć i rozwijać projekty bezpośrednio w Visual Studio.
Aby rozpocząć pracę z Node.js w Visual Studio, należy upewnić się, że odpowiednia paczka Node.js została zainstalowana. Aby to zrobić, wystarczy uruchomić Visual Studio Installer i sprawdzić dostępność workloadu Node.js w naszej instalacji. Po zainstalowaniu wymaganego workloadu, możemy stworzyć nowy projekt JavaScript, wybierając odpowiednią kategorię w kreatorze projektów.
Visual Studio oferuje trzy główne typy projektów JavaScript:
-
ASP.NET Core z nowoczesnym frameworkiem JavaScript - umożliwia integrację backendu z frontendem opartym na JavaScript.
-
Samodzielny projekt JavaScript (frontend) - dla projektów, które koncentrują się wyłącznie na warstwie klienta.
-
Projekt backendowy Node.js - dla aplikacji, które korzystają z Node.js w roli serwera.
Po wybraniu odpowiedniego typu projektu, Visual Studio uruchomi proces konfiguracji, w tym wywoła odpowiednie polecenia npm w celu utworzenia struktury aplikacji. Na przykład, w przypadku wyboru szablonu ReactApp, Visual Studio automatycznie uruchomi narzędzie npm CLI, aby utworzyć aplikację React.
Zarządzanie paczkami npm w Visual Studio odbywa się za pomocą wbudowanego menedżera npm, który umożliwia łatwe dodawanie i usuwanie zależności w pliku package.json. Po kliknięciu prawym przyciskiem myszy na węzeł npm w strukturze folderów, użytkownik może wybrać opcję instalacji nowych paczek, co otworzy okno menedżera. Dzięki temu, proces dodawania zależności do projektu staje się bardziej intuicyjny, bez konieczności korzystania z terminala.
Kiedy projekt jest gotowy do uruchomienia, kolejnym ważnym krokiem jest debugowanie. Visual Studio oferuje zaawansowane możliwości debugowania aplikacji JavaScript zarówno po stronie serwera, jak i klienta. Debugowanie po stronie serwera, oparte na Node.js, jest bardzo podobne do debugowania aplikacji napisanych w C#, co ułatwia pracę deweloperom. Proces obejmuje ustawianie punktów przerwania, uruchamianie aplikacji w trybie debugowania oraz inspekcję stanu aplikacji poprzez podświetlanie zmiennych lub korzystanie z okien debuggerskich, takich jak "Locals" czy "Watch".
Z kolei debugowanie skryptów po stronie klienta jest wspierane przez Visual Studio dla przeglądarek takich jak Chrome, Edge (Chromium) oraz Internet Explorer. Działa to na zasadzie zatrzymywania wykonywania aplikacji w miejscach ustawionych punktów przerwania w skryptach JavaScript, TypeScript czy wbudowanych w plikach HTML. Aby umożliwić debugowanie w tych przeglądarkach, należy aktywować odpowiednią opcję w ustawieniach debugowania.
Niezwykle istotną funkcją w przypadku pracy z aplikacjami, które korzystają z narzędzi takich jak TypeScript czy Babel, jest wsparcie dla map źródłowych (source maps). Mapy źródłowe pozwalają na śledzenie błędów w oryginalnym, nieprzetworzonym kodzie, co jest szczególnie przydatne w przypadku minifikowanych lub przetworzonych plików. Visual Studio automatycznie generuje mapy źródłowe dla projektów TypeScript, natomiast w przypadku JavaScriptu konieczna jest odpowiednia konfiguracja narzędzi buildowych, takich jak webpack.
Aby w pełni wykorzystać mapy źródłowe, należy upewnić się, że konfiguracja webpacka zawiera odpowiednią opcję generowania map źródłowych. Dla TypeScript konieczne jest ustawienie opcji sourceMap: true w pliku tsconfig.json. Dodatkowo, należy skonfigurować Visual Studio, aby poprawnie obsługiwało ścieżki w wygenerowanych plikach map źródłowych.
Kiedy mapy źródłowe są poprawnie skonfigurowane, debugowanie w Visual Studio staje się znacznie łatwiejsze, ponieważ umożliwia to pracę z kodem w jego pierwotnej, czytelnej formie. Dzięki tej funkcji, deweloperzy mogą szybko zlokalizować i naprawić błędy w aplikacjach JavaScript, co skraca czas potrzebny na ich debugowanie.
Wszystkie te narzędzia i funkcje sprawiają, że Visual Studio staje się potężnym środowiskiem do pracy z nowoczesnymi aplikacjami JavaScript. Dzięki wsparciu dla Node.js, npm, oraz zaawansowanym opcjom debugowania, programiści mogą skupić się na samej logice aplikacji, a nie na konfiguracji narzędzi. Integracja tych technologii z Visual Studio pozwala na stworzenie w pełni funkcjonalnych aplikacji zarówno po stronie klienta, jak i serwera.
Jak skutecznie wprowadzić testowanie jednostkowe i rozwój sterowany testami w Visual Studio 2022?
Testowanie jednostkowe oraz rozwój sterowany testami (TDD) to fundamentalne praktyki, które pozwalają na tworzenie bardziej niezawodnego, łatwiejszego do utrzymania i lepszego jakościowo oprogramowania. W tym rozdziale zgłębimy podstawowe zasady tych metod oraz pokażemy, jak skutecznie je wdrożyć w Visual Studio 2022, korzystając z narzędzi i frameworków dostępnych w tym środowisku.
Testowanie jednostkowe to proces weryfikacji poprawności działania pojedynczych jednostek kodu, najczęściej funkcji lub metod. Jego celem jest upewnienie się, że każda część systemu działa zgodnie z oczekiwaniami i spełnia określone wymagania. Dobre praktyki testowania jednostkowego wymagają, by testy były niezależne, szybkie i powtarzalne, co ułatwia wykrywanie i naprawianie błędów już na wczesnym etapie rozwoju.
Testowanie jednostkowe oraz TDD mają ogromny wpływ na jakość wytwarzanego oprogramowania. Przed przystąpieniem do implementacji nowej funkcjonalności, programista najpierw pisze testy, które określają, jak ma zachowywać się nowa funkcja. Testy te stanowią swoistą specyfikację zachowań systemu, a ich spełnienie w trakcie rozwoju oprogramowania stanowi dowód na to, że wprowadzona funkcjonalność działa zgodnie z założeniami.
W Visual Studio 2022 proces ten staje się znacznie prostszy dzięki integracji narzędzi do automatycznego generowania testów jednostkowych, takich jak IntelliTest, oraz wsparciu dla TDD, które pozwala na pisanie testów przed kodem. Rozpoczynamy od podstawowej konfiguracji środowiska w Visual Studio, dzięki której możemy łatwo uruchomić testowanie jednostkowe w projekcie. Następnie tworzymy pierwsze testy, korzystając z IntelliTest, który generuje testy automatycznie na podstawie kodu źródłowego. Takie podejście znacznie oszczędza czas, ponieważ nie trzeba ręcznie pisać wszystkich testów.
Dzięki podejściu TDD każdy test staje się „specyfikacją” kodu, co pomaga programiście zrozumieć, jak ma działać jego implementacja. Kluczowym elementem TDD jest to, że programista pisze testy zanim jeszcze powstanie sam kod, co pozwala unikać problemów związanych z późniejszym dodawaniem testów. Dzięki temu procesowi kod staje się bardziej elastyczny, mniej podatny na błędy i łatwiejszy w refaktoryzacji. Dodatkowo, narzędzie Live Unit Testing w Visual Studio umożliwia uruchamianie testów w tle, co sprawia, że programista ma na bieżąco informacje o stanie swojego kodu. Testy są uruchamiane za każdym razem, gdy wprowadza się zmiany w kodzie, co pozwala natychmiastowo wykrywać błędy.
Podstawowym założeniem testowania jednostkowego są zasady F.I.R.S.T., które powinny przyświecać każdemu twórcy testów. Oto jak te zasady przekładają się na codzienną pracę:
-
Szybkość: Testy muszą działać bardzo szybko, aby programista mógł je często uruchamiać i błyskawicznie otrzymywać informacje zwrotne. Wydajność testów zapewnia szybsze wykrywanie błędów i poprawia ogólną dynamikę pracy zespołu.
-
Izolacja: Każdy test powinien być niezależny od innych. W przypadku niepowodzenia jednego testu, nie powinno to wpływać na inne testy. Tylko w ten sposób można precyzyjnie wskazać przyczynę błędu.
-
Powtarzalność: Testy powinny zawsze przynosić te same wyniki, co umożliwia stabilność całego procesu testowego. Gdy test zawiedzie, programista ma możliwość jego powtarzania i analizowania wyników.
-
Samoweryfikacja: Testy muszą automatycznie oceniać, czy kod działa poprawnie, bez potrzeby ręcznej interpretacji wyników. Dzięki temu, wyniki testów są jednoznaczne, a proces debugowania staje się bardziej przejrzysty.
-
Terminowość: Testy należy pisać przed implementacją kodu. Taki sposób działania wymusza na programiście precyzyjne określenie oczekiwanego zachowania systemu jeszcze przed jego realizacją.
Wykorzystanie testów jednostkowych oraz TDD w Visual Studio 2022 może diametralnie poprawić jakość kodu, skracając czas potrzebny na wprowadzanie poprawek i zmniejszając liczbę błędów w aplikacjach. Dzięki tym technikom programista nie tylko unika wielu trudności, ale również buduje solidny fundament pod rozwój oprogramowania. Regularne pisanie testów pozwala na lepsze planowanie oraz implementację nowych funkcji, a narzędzia takie jak Live Unit Testing czy IntelliTest przyspieszają cały proces, czyniąc go bardziej wydajnym.
Warto pamiętać, że wprowadzenie tych praktyk wymaga zmiany podejścia do procesu tworzenia oprogramowania, ale jest to zmiana, która przynosi długofalowe korzyści. Testowanie jednostkowe i TDD nie tylko poprawiają jakość aplikacji, ale także uczą programistów myślenia o kodzie w sposób bardziej uporządkowany, co z kolei wpływa na łatwiejszą konserwację oraz rozbudowę systemu w przyszłości.
Jak stworzyć i wdrożyć własną rozszerzenie w Visual Studio?
Rozpoczęcie pracy nad własnym rozszerzeniem w Visual Studio to proces wymagający zarówno zrozumienia struktur IDE, jak i umiejętności dostosowania go do własnych potrzeb. Po skonfigurowaniu podstawowych ustawień projektu w Visual Studio, takich jak wybór lokalizacji zapisu plików, kolejnym krokiem jest stworzenie struktury projektu, która będzie fundamentem dla dalszego rozwoju rozszerzenia. Ważnym elementem jest określenie punktu wejścia do nowej funkcji. Najczęściej wykorzystuje się szablon komendy, który pozwala na łatwą integrację z interfejsem użytkownika Visual Studio. Aby to zrobić, należy kliknąć prawym przyciskiem myszy na projekt, wybrać "Add | New Item" i w zakładce "Extensibility" wybrać "Command".
Dodany szablon komendy zawiera wszystkie niezbędne elementy, takie jak plik .vsct (Visual Studio Command Table), który opisuje strukturę i zachowanie elementów interfejsu użytkownika dodanych do rozszerzenia. Plik ten pełni rolę mapy, wskazując, gdzie i jak pojawią się nowe przyciski, ikony czy menu w Visual Studio. Dodatkowo do projektu dodawany jest plik MyCustomCommand.cs, w którym określa się funkcjonalność komendy. Na początkowym etapie, komenda ta może na przykład wyświetlać prosty komunikat w oknie dialogowym.
Po utworzeniu rozszerzenia, możemy przetestować je w trybie debugowania, uruchamiając eksperymentalną instancję Visual Studio. Tam, w menu "Tools", znajdziemy naszą komendę "Invoke MyCustomCommand", która, jak już wspomniano, w tym przypadku otworzy jedynie komunikat.
Kiedy podstawowe funkcje rozszerzenia zostały zbudowane, warto poszerzyć je o dodatkowe opcje. W tym celu Visual Studio oferuje szeroką gamę szablonów, które pozwalają na modyfikację i wzbogacenie środowiska IDE. Przykładowo, w kategorii "Editor" znajdują się szablony umożliwiające edycję i rozbudowę edytora tekstu Visual Studio. Możemy tworzyć takie elementy jak klasyfikatory tekstu, które będą wyróżniać określone fragmenty kodu, np. komentarze "TODO", bądź dodawać własne marginesy w edytorze, które wyświetlą dodatkowe informacje o pliku.
Dzięki szablonom "Editor Margin" można na przykład wprowadzić mini-mapy, które umożliwiają szybsze poruszanie się po dużych plikach. Z kolei szablon "Editor Text Adornment" pozwala na dekorowanie tekstu w edytorze, jak dodawanie podkreśleń, przekreśleń czy zmiany tła, co może być użyteczne przy wizualnym oznaczaniu przestarzałych metod. Istnieją także bardziej zaawansowane opcje, jak "Editor Viewport Adornment", które pozwalają na nakładanie grafik lub elementów UI na widok edytora, co może być przydatne np. przy wyświetlaniu informacji o pliku tylko do odczytu.
Poza tym, dostępne są szablony dla "Toolbox", które umożliwiają tworzenie nowych elementów interfejsu dla aplikacji Windows Forms czy WPF w Visual Studio. VSPackages to kolejna kategoria, pozwalająca na tworzenie rozbudowanych rozszerzeń, które mogą modyfikować rdzeń IDE. Można tu tworzyć zarówno proste komendy, jak i bardziej zaawansowane okna narzędzi, które będą dodane do Visual Studio.
Jednym z ciekawszych elementów jest szablon "Async Package", który ułatwia tworzenie asynchronicznych operacji w rozszerzeniach, co może być przydatne przy długotrwałych operacjach, takich jak pobieranie danych z zewnętrznych usług. Kolejną przydatną funkcjonalnością jest "Async Tool Window", który umożliwia tworzenie okien narzędzi, które będą wykonywały operacje w tle, nie blokując interfejsu użytkownika. Dzięki temu Visual Studio nie traci na responsywności, co jest kluczowe przy pracy z dużymi projektami.
Po zakończeniu prac nad rozszerzeniem i przetestowaniu go, przychodzi czas na jego pakowanie i udostępnienie szerszej publiczności. Warto pamiętać, że rozszerzenia należy odpowiednio podpisać, aby zwiększyć ich wiarygodność i bezpieczeństwo. Pliki rozszerzeń są zapisywane w formacie .vsix, który zawiera wszystkie niezbędne pliki projektu.
Podzielając się rozszerzeniem z innymi użytkownikami Visual Studio, ważne jest, aby pamiętać o testowaniu i iteracyjnym ulepszaniu funkcji. Nawet po udostępnieniu rozszerzenia warto na bieżąco reagować na potrzeby użytkowników, wprowadzając odpowiednie poprawki i nowe funkcje, które zwiększą wygodę pracy z rozszerzeniem.
Rozwój własnych rozszerzeń do Visual Studio to proces wymagający zaawansowanej znajomości IDE oraz umiejętności programistycznych. Jednak dzięki dostępności różnorodnych szablonów, dokumentacji oraz przykładów w oficjalnym repozytorium GitHub, każdy programista może stworzyć funkcjonalne i skuteczne rozszerzenie, które zwiększy produktywność i ułatwi codzienną pracę.
Jak skonfigurować i uruchomić Live Unit Testing w Visual Studio?
Live Unit Testing to funkcjonalność, która automatycznie uruchamia testy jednostkowe w miarę wprowadzania zmian w kodzie, oferując szybki wgląd w pokrycie kodu testami. Aby w pełni wykorzystać tę funkcję w Visual Studio, ważne jest odpowiednie skonfigurowanie środowiska i zrozumienie jego działania. Live Unit Testing działa na zasadzie tworzenia kopii repozytorium, w której są przechowywane modyfikacje kodu. Każda niezapisana zmiana wprowadzona w Visual Studio jest integrowana z tym środowiskiem testowym, a następnie inicjowany jest proces kompilacji, uruchamiane testy, a na końcu generowany raport o pokryciu kodu.
Pierwsza konfiguracja odbywa się za pomocą kreatora, który umożliwia określenie źródeł i celów kopiowania plików. Kluczowe ustawienia obejmują:
-
Repository root: Jest to główny folder repozytorium, zawierający wszystkie pliki niezbędne do przeprowadzenia testów. Powinien on obejmować kod źródłowy, pliki binarne oraz narzędzia do testowania. W przypadku, gdy plik rozwiązania (solution file) nie znajduje się w tym folderze, konieczne będzie dostosowanie konfiguracji.
-
Workspace folder: Jest to folder, w którym Live Unit Testing przechowuje kopię repozytorium. Domyślnie jest to folder o nazwie
lut, który tworzony jest w katalogu domowym użytkownika, jednak może być dowolnie dostosowany. -
Excluded files: Z tego ustawienia korzysta się, aby wykluczyć z kopiowania do środowiska Live Unit Testing pliki, które mogą zakłócać proces kompilacji, takie jak pliki generowane podczas budowania projektu.
-
Opcje kompilacji: Domyślnie, Live Unit Testing wykorzystuje wiele rdzeni procesora w celu przyspieszenia kompilacji.
-
Test case timeout: Określa czas, po którym testy zostaną automatycznie przerwane, jeśli nie zakończą się w wyznaczonym czasie.
-
Używanie wielu procesorów: Zgodnie z domyślnymi ustawieniami, Live Unit Testing stara się wykorzystywać wiele rdzeni procesora, co przyspiesza wykonywanie testów. Jeśli jednak masz problem z wydajnością lub zauważasz konflikty plików podczas wykonywania testów równolegle, możesz odznaczyć tę opcję.
Podczas konfiguracji, jeśli zdecydujesz się na wykluczenie plików, możesz zdefiniować własne zasady, co jest realizowane przez edytor pliku lutignore. Format tego pliku przypomina plik .gitignore i pozwala na określenie reguł dotyczących folderów lub plików tworzonych w trakcie procesu kompilacji. Na przykład, aby zapobiec kopiowaniu folderów BIN i OBJ do środowiska Live Unit Testing, należy dodać odpowiednie wpisy w tym pliku.
Przykładowe reguły w pliku lutignore to:
Te reguły zapobiegają kopiowaniu folderów BIN i OBJ do środowiska Live Unit Testing. W przypadku, gdy w repozytorium znajduje się pojedynczy folder kompilacji, należy wskazać ten folder w pliku lutignore, aby go wykluczyć:
Jeśli w tym folderze znajdują się dodatkowe narzędzia, które muszą zostać uwzględnione, można to zrobić, dodając wyjątek:
Takie reguły zapewnią, że folder ARTIFACTS nie zostanie skopiowany, ale folder TOOLS wewnątrz ARTIFACTS już tak.
Po zakończeniu konfiguracji Live Unit Testing czeka na zestaw testów do uruchomienia. Testy można dodać za pomocą ikony ołówka, lub dodać wszystkie testy klikając odpowiedni link w dolnej części okna.
Podczas uruchamiania testów, w przypadku, gdy wynik testu zmienia się (np. testy przechodzą lub nie przechodzą), oznaczenia obok kodu również się zmieniają. Zielone ptaszki wskazują na pokrycie kodu testami, a czerwone krzyżyki oznaczają testy, które nie przeszły.
Gdy zmieniamy kod i testy nie przechodzą, proces kompilacji i uruchamiania testów jest automatycznie wyzwalany. Dzięki temu można szybko zobaczyć, które części kodu wymagają poprawek. W przypadku dużych baz kodu może zdarzyć się, że nie wszystkie testy zakończą się przed dokonaniem zmian w kodzie. W takim przypadku pomocne może okazać się dostosowanie ustawień Live Unit Testing za pomocą opcji dostępnych w menu:
Narzędzia | Opcje | Live Unit Testing | Ogólne.
Dzięki tym ustawieniom użytkownik może dopasować działanie Live Unit Testing do swoich potrzeb i uzyskać jak najlepsze rezultaty pracy.
Podsumowując, Live Unit Testing w Visual Studio pozwala na bieżąco monitorować pokrycie kodu testami, umożliwiając natychmiastową weryfikację wprowadzanych zmian i skuteczne zarządzanie jakością kodu. Ta funkcjonalność jest niezwykle przydatna w ramach TDD (Test-Driven Development), ponieważ pozwala na szybkie sprawdzenie, czy zmiany w kodzie nie wprowadziły regresji, oraz na łatwiejsze utrzymanie jakości w dłuższym okresie.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский