Udostępnij za pomocą


Samouczek: Programowanie w podejściu testowym przy użyciu funkcji "Generowanie na podstawie użycia"

W tym temacie pokazano, jak używać funkcji Generowanie na podstawie użycia , która obsługuje programowanie oparte na testach.

Programowanie oparte na testach to podejście do projektowania oprogramowania, w którym najpierw piszesz testy jednostkowe na podstawie specyfikacji produktu, a następnie napisz kod źródłowy wymagany do pomyślnego wykonania testów. Program Visual Studio obsługuje programowanie testowe po raz pierwszy, generując nowe typy i elementy członkowskie w kodzie źródłowym podczas pierwszego odwołowania się do nich w przypadkach testowych, zanim zostaną zdefiniowane.

Visual Studio generuje nowe typy i członków z minimalnymi przerwami w przepływie pracy. Możesz tworzyć szkice dla typów, metod, właściwości, pól lub konstruktorów bez opuszczania bieżącej lokalizacji w kodzie. Po otwarciu okna dialogowego w celu określenia opcji generowania typu fokus zostanie natychmiast zwrócony do bieżącego otwartego pliku po zamknięciu okna dialogowego.

Funkcja Generowanie na podstawie użycia może być używana z platformami testowymi, które integrują się z programem Visual Studio. W tym temacie przedstawiono platformę Microsoft Unit Testing Framework.

Uwaga / Notatka

Instrukcje przedstawione w tym artykule ilustrują najnowszą wersję interaktywnego środowiska projektowego (IDE) dostępnego w programie Visual Studio. Na komputerze mogą być wyświetlane różne nazwy lub lokalizacje niektórych elementów interfejsu użytkownika. Być może używasz innej wersji programu Visual Studio lub różnych ustawień środowiska. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.

Tworzenie projektu biblioteki klas systemu Windows i projektu testowego

  1. W języku C# lub Visual Basic utwórz nowy projekt Biblioteka klas systemu Windows . Nazwij to GFUDemo_VB lub GFUDemo_CS, w zależności od języka, którego używasz.

  2. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy ikonę rozwiązania u góry, a następnie wybierz polecenie Dodaj>nowy projekt.

  3. Utwórz nowy projekt testów jednostkowych (.NET Framework).

Dodawanie odwołania do projektu Biblioteka klas

  1. W Eksploratorze rozwiązań, w projekcie testu jednostkowego, kliknij prawym przyciskiem myszy na wpis Odwołania i wybierz polecenie Dodaj odwołanie.

  2. W oknie dialogowym Menedżer odwołań wybierz pozycję Projekty , a następnie wybierz projekt biblioteki klas.

  3. Wybierz przycisk OK , aby zamknąć okno dialogowe Menedżer odwołań .

  4. Zapisz rozwiązanie. Teraz możesz rozpocząć pisanie testów.

Generowanie nowej klasy na podstawie testu jednostkowego

  1. Projekt testowy zawiera plik o nazwie UnitTest1. Kliknij dwukrotnie ten plik w Eksploratorze rozwiązań , aby otworzyć go w edytorze kodu. Wygenerowano klasę testową i metodę testową.

  2. Znajdź deklarację klasy UnitTest1 i zmień jej nazwę na AutomobileTest.

    Uwaga / Notatka

    Funkcja IntelliSense udostępnia teraz dwie opcje dla uzupełniania instrukcji IntelliSense: tryb uzupełniania i tryb sugestii. Użyj trybu sugestii w sytuacjach, w których klasy i składowe są używane przed ich zdefiniowaną definicją. Po otwarciu okna IntelliSense możesz nacisnąć Ctrl+Alt+Spacja, aby przełączać się między trybem uzupełniania a trybem sugestii. Aby uzyskać więcej informacji, zobacz Używanie funkcji IntelliSense . Tryb sugestii pomoże podczas wpisywania Automobile w następnym kroku.

  3. Znajdź metodę TestMethod1() i zmień jej nazwę na DefaultAutomobileIsInitializedCorrectly(). Wewnątrz tej metody utwórz nowe wystąpienie klasy o nazwie Automobile, jak pokazano na poniższych zrzutach ekranu. Zostanie wyświetlona falowana linia podkreślenia, która wskazuje błąd czasu kompilacji, a ikonka błędu w postaci żarówki Szybkie akcje pojawi się na lewym marginesie lub bezpośrednio poniżej falowanej linii po najechaniu na nią kursorem.

    Szybkie akcje w Visual Basic

    Szybkie akcje w języku C#

  4. Wybierz lub kliknij ikonę żarówki Szybkie akcje. Zostanie wyświetlony komunikat o błędzie informujący, że typ Automobile nie jest zdefiniowany. Przedstawiono również niektóre rozwiązania.

  5. Kliknij pozycję Generuj nowy typ , aby otworzyć okno dialogowe Generowanie typu . To okno dialogowe zawiera opcje, które obejmują generowanie typu w innym projekcie.

  6. Na liście Projekt kliknij GFUDemo_VB lub GFUDemo_CS , aby poinstruować program Visual Studio, aby dodać plik do projektu biblioteki klas zamiast projektu testowego. Jeśli jeszcze nie wybrano, wybierz pozycję Utwórz nowy plik i nadaj mu nazwę Automobile.cs lub Automobile.vb.

    Okno dialogowe 'Generuj nowy typ'

  7. Kliknij przycisk OK , aby zamknąć okno dialogowe i utworzyć nowy plik.

  8. W Eksploratorze rozwiązań przejrzyj węzeł projektu GFUDemo_VB lub GFUDemo_CS , aby sprawdzić, czy jest tam nowy plik Automobile.vb lub Automobile.cs . W edytorze kodu kursor nadal znajduje się w AutomobileTest.DefaultAutomobileIsInitializedCorrectly elemencie, co pozwala na kontynuowanie pisania testu przy minimalnych zakłóceniach.

Generowanie szablonu właściwości

Załóżmy, że specyfikacja produktu wskazuje, że Automobile klasa ma dwie właściwości publiczne o nazwie Model i TopSpeed. Właściwości te muszą być inicjalizowane domyślnymi wartościami "Not specified" i -1 przez domyślny konstruktor. Poniższy test jednostkowy sprawdzi, czy domyślny konstruktor ustawi właściwości na poprawne wartości domyślne.

  1. Dodaj następujący wiersz kodu do metody testowej DefaultAutomobileIsInitializedCorrectly .

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. Ponieważ kod odwołuje się do dwóch niezdefiniowanych właściwości w Automobile, pod Model i TopSpeed pojawia się falista linia podkreślająca. Umieść kursor na Model i wybierz żarówkę błędów Szybkie akcje, a następnie wybierz pozycję Generuj właściwość 'Automobile.Model'.

  3. Wygeneruj szkielet właściwości TopSpeed w ten sam sposób.

    Automobile W klasie typy nowych właściwości są poprawnie wnioskowane z kontekstu.

Generowanie szkieletu dla nowego konstruktora

Teraz utworzymy metodę testową, która wygeneruje szkielet konstruktora do zainicjowania właściwości Model i TopSpeed. Później dodasz więcej kodu, aby ukończyć test.

  1. Dodaj następującą dodatkową metodę testową do klasy AutomobileTest .

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. Kliknij żarówkę błędu Szybkie akcje pod czerwonym wywiórką, a następnie kliknij pozycję Generuj konstruktor w obszarze "Samochody".

    W pliku klasy Automobile zauważ, że nowy konstruktor zbadał nazwy zmiennych lokalnych używanych w wywołaniu konstruktora, znalazł właściwości o tych samych nazwach w klasie Automobile, i umieścił kod w treści konstruktora do przechowywania wartości argumentów we właściwościach Model i TopSpeed.

  3. Po wygenerowaniu nowego konstruktora pojawi się faliste podkreślenie pod wywołaniem domyślnego konstruktora w DefaultAutomobileIsInitializedCorrectly. Komunikat o błędzie informuje, że Automobile klasa nie ma konstruktora, który przyjmuje zero argumentów. Aby wygenerować jawny konstruktor domyślny, który nie ma parametrów, kliknij żarówkę błędów Szybkie akcje, a następnie kliknij Generuj konstruktor w 'Automobile'.

Generowanie wycinku dla metody

Załóżmy, że specyfikacja wskazuje, że nowy Automobile może zostać umieszczony w stanie IsRunning, jeśli jego właściwości Model i TopSpeed są ustawione na coś innego niż wartości domyślne.

  1. Dodaj następujące wiersze do AutomobileWithModelNameCanStart metody .

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Kliknij żarówkę błędów Akcji szybkiej dla myAuto.Start wywołania metody, a następnie kliknij Generuj metodę 'Automobile.Start'.

  3. Kliknij żarówkę Szybkie akcje dla IsRunning właściwości, a następnie kliknij Generuj właściwość 'Automobile.IsRunning'.

    Klasa Automobile zawiera teraz metodę o nazwie Start() i właściwość o nazwie IsRunning.

Uruchamianie testów

  1. W menu Test wybierz pozycję Uruchom>wszystkie testy.

    Polecenie Uruchom>wszystkie testy uruchamia wszystkie testy w dowolnych strukturach testowych napisanych dla bieżącego rozwiązania. W tym przypadku istnieją dwa testy i oba te testy kończą się niepowodzeniem zgodnie z oczekiwaniami. Test DefaultAutomobileIsInitializedCorrectly kończy się niepowodzeniem, ponieważ warunek Assert.IsTrue zwraca False. Test AutomobileWithModelNameCanStart kończy się niepowodzeniem, ponieważ Start metoda w Automobile klasie zgłasza wyjątek.

    Okno Wyniki testów zostało pokazane na poniższej ilustracji.

    Wyniki testu, które zakończyły się niepowodzeniem

  2. W oknie Wyniki testu kliknij dwukrotnie każdy wiersz wyników testu, aby przejść do lokalizacji każdego testu.

Implementowanie kodu źródłowego

  1. Dodaj następujący kod do konstruktora domyślnego, aby właściwości Model, TopSpeed i IsRunning zostały zainicjowane do poprawnych wartości domyślnych "Not specified", -1 i False (lub false dla języka C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Po wywołaniu metody Start, należy ustawić flagę IsRunning na true tylko wtedy, gdy właściwości Model lub TopSpeed są ustawione na wartość inną niż domyślna. Usuń element NotImplementedException z treści metody i dodaj następujący kod.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

Ponownie uruchom testy

  • W menu Test wskaż polecenie Uruchom, a następnie kliknij pozycję Wszystkie testy.

    Tym razem testy przechodzą pomyślnie. Okno Wyniki testów zostało pokazane na poniższej ilustracji.

    Wyniki testów, które przeszły