Przewodnik: programowanie testowe z funkcją 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.

Program Visual Studio generuje nowe typy i elementy członkowskie z minimalnymi przerwami w przepływie pracy. Można tworzyć wycinki 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

Na komputerze mogą być wyświetlane różne nazwy lub lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio w tym artykule. Być może używasz innej wersji programu Visual Studio lub innych 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. Nadaj mu GFUDemo_VB nazwę lub GFUDemo_CS, w zależności od używanego języka.

  2. W Eksplorator 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 Eksplorator rozwiązań w projekcie testu jednostkowego kliknij prawym przyciskiem myszy 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 Eksplorator 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

    Funkcja IntelliSense udostępnia teraz dwie alternatywy 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 funkcji IntelliSense możesz nacisnąć klawisze Ctrl+Alt+Spacja, aby przełączać się między trybem uzupełniania i 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 podkreślona linia, która wskazuje błąd czasu kompilacji, a żarówka żarówki z błędem Szybkie akcje pojawia się na lewym marginesie lub bezpośrednio poniżej przełącznika po umieszczeniu kursora na nim.

    Szybkie akcje w Visual Basic

    Szybkie akcje w języku C#

  4. Wybierz lub kliknij żarówkę 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 Project (Projekt) kliknij pozycję 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 Generowanie nowego typu

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

  8. W Eksplorator rozwiązań zapoznaj się z węzłem projektu GFUDemo_VB lub GFUDemo_CS, aby sprawdzić, czy jest tam nowy plik Automobile.vb lub Automobile.cs. W edytorze kodu fokus jest nadal w AutomobileTest.DefaultAutomobileIsInitializedCorrectlyelemecie , co umożliwia kontynuowanie pisania testu z minimalną przerwą.

Generowanie wycinków 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. Te właściwości muszą być inicjowane przy użyciu wartości domyślnych "Not specified" i -1 domyślnie konstruktora. 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 elemencie Automobile, w obszarze Model i pojawia się falisty podkreślony element .TopSpeed Umieść kursor na Model i wybierz żarówkę żarówki błędów Szybkich akcji , a następnie wybierz pozycję Generuj właściwość Automobile.Model.

  3. Wygeneruj wycinkę TopSpeed właściwości w taki sam sposób.

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

Generowanie wycinku dla nowego konstruktora

Teraz utworzymy metodę testową, która wygeneruje wycinkę konstruktora w celu zainicjowania Model właściwości 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".

    Automobile W pliku klasy zwróć uwagę, że nowy konstruktor zbadał nazwy zmiennych lokalnych, które są używane w wywołaniu konstruktora, znaleźć właściwości, które mają te same nazwy w Automobile klasie, i podano kod w treści konstruktora do przechowywania wartości argumentów we Model właściwościach iTopSpeed.

  3. Po wygenerowaniu nowego konstruktora pod wywołaniem domyślnego konstruktora w pliku DefaultAutomobileIsInitializedCorrectlypojawi się faliste podkreślenie. 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ę żarówki błędów Szybkie akcje, a następnie kliknij pozycję Generuj konstruktor w obszarze "Samochody".

Generowanie wycinku dla metody

Załóżmy, że specyfikacja wskazuje, że nowy Automobile może zostać umieszczony w IsRunning stanie, jeśli jego Model właściwości 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ę żarówki błędów Szybkich akcji dla myAuto.Start wywołania metody, a następnie kliknij pozycję Generuj metodę "Automobile.Start".

  3. Kliknij żarówkę IsRunning Szybkie akcje dla właściwości, a następnie kliknij pozycję 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 Assert.IsTrue , ponieważ warunek zwraca Falsewartość . 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 ModelTopSpeed właściwości , i IsRunning zostały zainicjowane do poprawnych wartości domyślnych "Not specified", -1i False (lub false dla języka C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Po wywołaniu Start metody należy ustawić flagę IsRunning na true tylko wtedy, gdy Model właściwości lub TopSpeed są ustawione na inną niż ich wartość 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