Cvičení – kontrola a otestování konzolové aplikace jazyka C# pomocí ukázkových dat

Dokončeno

V tomto cvičení zkontrolujete a otestujete kód v počátečním projektu, izolujete a opravíte problém s logikou a ověříte, že aktualizovaná aplikace funguje podle očekávání.

Během tohoto cvičení provedete následující úkoly:

  1. Revize kódu: Zkontrolujte obsah souboru Program.cs.

    Program.cs obsahuje následující části kódu:

    • Příkazy nejvyšší úrovně: příkazy nejvyšší úrovně simulují řadu transakcí pomocí pole testData nebo většího počtu náhodně generovaných transakcí.
    • LoadTillEachMorning: LoadTillEachMorning metoda se používá ke konfiguraci pokladny do předdefinovaného počtu faktur v každé nominální hodnotě.
    • MakeChange: MakeChange metoda se používá ke správě hotovosti do doby, než dojde k nákupu transakcí.
    • LogTillStatus: LogTillStatus Metoda se používá k zobrazení počtu faktur každé nominální hodnoty, které jsou aktuálně v době do.
    • TillAmountSummary: TillAmountSummary metoda se používá zobrazení zprávy s částkou hotovosti v till.
  2. Počáteční testování: Ověřte, že MakeChange při použití testData pole k simulaci transakcí úspěšně vyrovná peníze.

  3. Ladění kódu: Izolujte a opravte problém logiky, který se zobrazí při použití náhodně generovaných dat.

  4. Ověřovací test: Proveďte ověřovací test kódu, který vyvíjíte v tomto cvičení.

Kontrola obsahu souboru Program.cs

V tomto úkolu dokončíte návod k počátečnímu kódu projektu. Soubor Program.cs obsahuje aplikaci, která simuluje podmínky pro denní transakce. Aplikace volá metodu MakeChange pro správu peněz do každé transakce. Jiné metody se používají k inicializaci zprávy do a generování sestav.

  1. Ujistěte se, že je složka GuidedProject otevřená v editoru Visual Studio Code.

  2. V zobrazení PRŮZKUMNÍK rozbalte složky GuidedProject a Starter .

    Složka Starter obsahuje ukázkovou aplikaci pro tento modul projektu s asistencí.

  3. Otevřete soubor Program.cs v editoru Visual Studio Code.

  4. V nabídce Zobrazit vyberte paletu příkazů.

  5. Na příkazovém řádku zadejte .net: g a pak vyberte .NET: Generovat prostředky pro sestavení a ladění.

  6. V okně Vybrat projekt, který chcete spustit , vyberte počáteční projekt.

    Vytvořený soubor launch.json bude obsahovat konfiguraci pro počáteční projekt.

  7. Kontrola příkazů nejvyšší úrovně pro tuto aplikaci trvá několik minut:

    /*
    This application manages transactions at a store check-out line. The
    check-out line has a cash register, and the register has a cash till
    that is prepared with a number of bills each morning. The till includes
    bills of four denominations: $1, $5, $10, and $20. The till is used
    to provide the customer with change during the transaction. The item 
    cost is a randomly generated number between 2 and 49. The customer 
    offers payment based on an algorithm that determines a number of bills
    in each denomination. 
    
    Each day, the cash till is loaded at the start of the day. As transactions
    occur, the cash till is managed in a method named MakeChange (customer 
    payments go in and the change returned to the customer comes out). A 
    separate "safety check" calculation that's used to verify the amount of
    money in the till is performed in the "main program". This safety check
    is used to ensure that logic in the MakeChange method is working as 
    expected.
    */
    
    string? readResult = null;
    bool useTestData = true;
    
    Console.Clear();
    
    int[] cashTill = new int[] { 0, 0, 0, 0 };
    int registerCheckTillTotal = 0;
    
    // registerDailyStartingCash: $1 x 50, $5 x 20, $10 x 10, $20 x 5 => ($350 total)
    int[,] registerDailyStartingCash = new int[,] { { 1, 50 }, { 5, 20 }, { 10, 10 }, { 20, 5 } };
    
    int[] testData = new int[] { 6, 10, 17, 20, 31, 36, 40, 41 };
    int testCounter = 0;
    
    LoadTillEachMorning(registerDailyStartingCash, cashTill);
    
    registerCheckTillTotal = registerDailyStartingCash[0, 0] * registerDailyStartingCash[0, 1] + registerDailyStartingCash[1, 0] * registerDailyStartingCash[1, 1] + registerDailyStartingCash[2, 0] * registerDailyStartingCash[2, 1] + registerDailyStartingCash[3, 0] * registerDailyStartingCash[3, 1];
    
    // display the number of bills of each denomination currently in the till
    LogTillStatus(cashTill);
    
    // display a message showing the amount of cash in the till
    Console.WriteLine(TillAmountSummary(cashTill));
    
    // display the expected registerDailyStartingCash total
    Console.WriteLine($"Expected till value: {registerCheckTillTotal}\n\r");
    
    var valueGenerator = new Random((int)DateTime.Now.Ticks);
    
    int transactions = 10;
    
    if (useTestData)
    {
        transactions = testData.Length;
    }
    
    while (transactions > 0)
    {
        transactions -= 1;
        int itemCost = valueGenerator.Next(2, 20);
    
        if (useTestData)
        {
            itemCost = testData[testCounter];
            testCounter += 1;
        }
    
        int paymentOnes = itemCost % 2;                 // value is 1 when itemCost is odd, value is 0 when itemCost is even
        int paymentFives = (itemCost % 10 > 7) ? 1 : 0; // value is 1 when itemCost ends with 8 or 9, otherwise value is 0
        int paymentTens = (itemCost % 20 > 13) ? 1 : 0; // value is 1 when 13 < itemCost < 20 OR 33 < itemCost < 40, otherwise value is 0
        int paymentTwenties = (itemCost < 20) ? 1 : 2;  // value is 1 when itemCost < 20, otherwise value is 2
    
        // display messages describing the current transaction
        Console.WriteLine($"Customer is making a ${itemCost} purchase");
        Console.WriteLine($"\t Using {paymentTwenties} twenty dollar bills");
        Console.WriteLine($"\t Using {paymentTens} ten dollar bills");
        Console.WriteLine($"\t Using {paymentFives} five dollar bills");
        Console.WriteLine($"\t Using {paymentOnes} one dollar bills");
    
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        // Backup Calculation - each transaction adds current "itemCost" to the till
        if (transactionMessage == "transaction succeeded")
        {
            Console.WriteLine($"Transaction successfully completed.");
            registerCheckTillTotal += itemCost;
        }
        else
        {
            Console.WriteLine($"Transaction unsuccessful: {transactionMessage}");
        }
    
        Console.WriteLine(TillAmountSummary(cashTill));
        Console.WriteLine($"Expected till value: {registerCheckTillTotal}\n\r");
        Console.WriteLine();
    }
    
    Console.WriteLine("Press the Enter key to exit");
    do
    {
        readResult = Console.ReadLine();
    
    } while (readResult == null);
    

    Kód příkazů nejvyšší úrovně dokončí následující úlohy:

    • Nakonfiguruje data aplikace a proměnné prostředí použité k otestování MakeChange metody.
    • LoadTillEachMorning()Volá , LogTillStatus()a TillAmountSummary() metody připravit peníze do a vytisknou stavové zprávy do konzoly.
    • while Pomocí smyčky simuluje řadu transakcí.
    • Volá metodu MakeChange z bloku kódu smyčky while .
    • Hlásí stav peněz až po každé transakci.

    Poznámka:

    Příkazy nejvyšší úrovně zahrnují Console.ReadLine() příkaz. Před launch.json laděním bude nutné soubor aktualizovat.

  8. Chvíli se podívejte na metodu LoadTillEachMorning() .

    static void LoadTillEachMorning(int[,] registerDailyStartingCash, int[] cashTill)
    {
        cashTill[0] = registerDailyStartingCash[0, 1];
        cashTill[1] = registerDailyStartingCash[1, 1];
        cashTill[2] = registerDailyStartingCash[2, 1];
        cashTill[3] = registerDailyStartingCash[3, 1];
    }
    
  9. Zkontrolujte metodu MakeChange() za několik minut.

    static string MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    {
        string transactionMessage = "";
    
        cashTill[3] += twenties;
        cashTill[2] += tens;
        cashTill[1] += fives;
        cashTill[0] += ones;
    
        int amountPaid = twenties * 20 + tens * 10 + fives * 5 + ones;
        int changeNeeded = amountPaid - cost;
    
        if (changeNeeded < 0)
            transactionMessage = "Not enough money provided.";
    
        Console.WriteLine("Cashier Returns:");
    
        while ((changeNeeded > 19) && (cashTill[3] > 0))
        {
            cashTill[3]--;
            changeNeeded -= 20;
            Console.WriteLine("\t A twenty");
        }
    
        while ((changeNeeded > 9) && (cashTill[2] > 0))
        {
            cashTill[2]--;
            changeNeeded -= 10;
            Console.WriteLine("\t A ten");
        }
    
        while ((changeNeeded > 4) && (cashTill[1] > 0))
        {
            cashTill[2]--;
            changeNeeded -= 5;
            Console.WriteLine("\t A five");
        }
    
        while ((changeNeeded > 0) && (cashTill[0] > 0))
        {
            cashTill[0]--;
            changeNeeded--;
            Console.WriteLine("\t A one");
        }
    
        if (changeNeeded > 0)
            transactionMessage = "Can't make change. Do you have anything smaller?";
    
        if (transactionMessage == "")
            transactionMessage = "transaction succeeded";
    
        return transactionMessage;
    }
    

    Metoda MakeChange spravuje peníze do každé nákupní transakce. Proces transakce spoléhá na následující prostředky a podmínky:

    • Hotovostní transakce: Metoda MakeChange přijímá platbu hotovostí od zákazníka a pak určuje, kolik faktur každé nominální hodnoty musí být vráceno zákazníkovi ve změně. MakeChange musí nejprve zajistit, aby zákazník poskytl dostatek peněz na pokrytí transakce. Pokud je platba dostatečná, proces "provést změnu" začíná největší nominální hodnotou faktury a pracuje na nejmenší nominální hodnotě. V každé fázi zajišťuje, MakeChange aby aktuální nominální hodnota byla menší než změna. MakeChange také zajišťuje, že faktura požadované nominální hodnoty bude k dispozici do doby, než ji přidáte ke změně vrácenou zákazníkovi.

    • Vstupní parametry: Metoda MakeChange používá následující vstupní parametry:

      • Celé číslo představující náklady na zakoupenou položku: itemCost
      • Celočíselná matice obsahující počet faktur v poplatcích do každé nominální hodnoty: cashTill
      • Platba nabízená zákazníkem, pokud je počet faktur za každou nominální hodnotu určen samostatně: paymentTwenties, paymentTens, , paymentFivespaymentOnes
    • Hotovost dostupná do: Faktury nabízené jako platba zákazníkem musí být zahrnuty do faktur každé nominální hodnoty, které jsou k dispozici pro provedení změny.

    • Změna dlužená zákazníkovi: Změna dlužená zákazníkovi se vypočítá pomocí částky zaplacené zákazníkem minus náklady na položku.

    • Podplacení: Pokud zákazník nezadá dostatečnou platbu, MakeChange vrátí popisnou zprávu a transakce se zruší.

    • Nedostatek do: Pokud do té doby nelze provést přesnou změnu, MakeChange vrátí popisnou zprávu a transakce je zrušena.

  10. Chvíli se podívejte na metodu LogTillStatus() .

    static void LogTillStatus(int[] cashTill)
    {
        Console.WriteLine("The till currently has:");
        Console.WriteLine($"{cashTill[3] * 20} in twenties");
        Console.WriteLine($"{cashTill[2] * 10} in tens");
        Console.WriteLine($"{cashTill[1] * 5} in fives");
        Console.WriteLine($"{cashTill[0]} in ones");
        Console.WriteLine();
    }
    

    Metoda LogTillStatus používá cashTill pole k hlášení aktuálního obsahu do.

  11. Chvíli se podívejte na metodu TillAmountSummary() .

    static string TillAmountSummary(int[] cashTill)
    {
        return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars";
    
    }
    

    Metoda TillAmountSummary používá cashTill matici k výpočtu aktuálního peněžního zůstatku, který je k dispozici do.

Tím dokončíte kontrolu stávajícího projektu kódu.

Ověření úspěšné MakeChange správy peněz při použití testData pole

V tomto úkolu simulujete transakce pomocí testData pole a ověříte, že MakeChange úspěšně vyrovnává peníze do doby.

  1. V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.

  2. Všimněte si, že dojde k IOException chybě.

    KONZOLa DEBUG nepodporuje Console.Clear() ani Console.ReadLine() metody. Před laděním musíte aktualizovat soubor launch.json.

  3. Na panelu nástrojů Ladění vyberte Zastavit.

  4. Pomocí zobrazení PRŮZKUMNÍK otevřete soubor launch.json.

  5. V souboru launch.json aktualizujte console atribut následujícím způsobem:

    // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
    "console":"integratedTerminal",
    

    Výchozí hodnota atributu console je internalConsole, která odpovídá panelu KONZOLY LADĚNÍ. Panel KONZOLY LADĚNÍ bohužel nepodporuje některé metody konzoly. Nastavení integratedTerminal se zarovná na panel TERMINÁL, který podporuje vstup a výstup konzoly.

  6. Uložte změny do souboru launch.json.

  7. V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.

  8. Zkontrolujte výstup vygenerovaný aplikací na panelu TERMINÁL.

    Přepněte z panelu KONZOLY LADĚNÍ na panel TERMINÁL a zkontrolujte výstup.

  9. Všimněte si, že MakeChange při použití testData pole k simulaci transakcí se úspěšně vyrovnává hodnota do té doby.

    V dolní části nahlášeného výstupu by se měly zobrazit následující řádky:

    The till has 551 dollars
    Expected till value: 551
    
    
    Press the Enter key to exit
    

    Všimněte si, že hlášené a očekávané hodnoty jsou 551.

  10. Pokud chcete aplikaci opustit, stiskněte Enter.

Identifikace a oprava problémů s logikou

V této úloze použijete simulované transakce k vystavení problému s logikou kódu a pak pomocí nástrojů ladicího programu editoru Visual Studio Code izolujete a opravíte problém.

  1. Chcete-li spustit kód pomocí náhodně generovaných transakcí, změňte hodnotu přiřazenou k useTestDatafalse.

    Proměnnou useTestData najdete v horní části příkazů nejvyšší úrovně.

  2. Uložte soubor Program.cs a spusťte aplikaci v ladicím programu.

  3. Zkontrolujte výstup na panelu TERMINAL.

  4. Všimnětesich

    Konečný zůstatek vypočítaný MakeChange podle zůstatku a zůstatek udržovaný v výpisech nejvyšší úrovně se zobrazí v dolní části výstupu. Příklad:

    Transaction successfully completed.
    The till has 379 dollars
    Expected till value: 434
    
    
    Press the Enter key to exit
    

    Poznámka:

    Aplikace náhodně generuje náklady na nákupní položky. Proto se hodnoty dokazované ve výstupu liší.

  5. Aplikaci ukončíte stisknutím klávesy Enter.

  6. Zavřete panel TERMINÁL.

Ladění kódu

V této úloze použijete nástroje ladicího programu editoru Visual Studio Code k izolaci a opravě problému s logikou.

  1. Na konci příkazů nejvyšší úrovně vyhledejte následující řádek kódu:

    Console.WriteLine();
    
  2. Nastavte zarážku na vybraném řádku kódu.

  3. V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.

  4. Všimněte si, že provádění kódu se pozastaví na zarážce.

  5. Na panelu nástrojů Ovládací prvky ladění vyberte Krok do.

  6. Zkontrolujte výstup na panelu TERMINAL.

  7. Pokud jsou hlášené a očekávané hodnoty stejné, vyberte na panelu nástrojů Ovládací prvky ladění možnost Pokračovat.

  8. Opakujte předchozí krok, dokud neuvidíte nesrovnalosti mezi hlášenými a očekávanými hodnotami.

  9. Jakmile uvidíte nesrovnalosti, prohlédněte si podrobnosti transakce za minutu.

  10. Všimněte si, že nahlášená hotovost přijatá a vrácená změna je správná, ale do té doby je kratší než pět dolarů.

    Tento nedostatek naznačuje, že cashTill pole je aktualizováno nesprávně, i když je hlášení správné.

  11. Zastavte ladicí relaci a zavřete panel TERMINÁL.

  12. Posuňte se na konec MakeChange metody.

    Příkazy while použité k provedení změny se nacházejí na konci MakeChange metody.

  13. while Zkontrolujte bloky kódu příkazu, které se používají k provedení změn.

    Vzhledem k tomu, že do té doby je vypnuto o pět dolarů, je pravděpodobné, že problém bude v while bloku kódu, který se používá k vrácení pěti dolarových faktur.

  14. Všimněte si následujícího kódu:

    while ((changeNeeded > 4) && (cashTill[1] > 0))
    {
        cashTill[2]--;
        changeNeeded -= 5;
        Console.WriteLine("\t A five");
    }    
    

    Pole cashTill[] slouží k uložení počtu faktur jednotlivých nominálních hodnot, které jsou aktuálně k dispozici. Prvek 1 Array se používá ke správě počtu pěti dolarových faktur v do. Výraz v while příkazu odkazuje cashTill[1] správně. Příkaz uvnitř bloku kódu se ale dekrementuje cashTill[2] místo cashTill[1]. Určení indexové 2 hodnoty znamená, že se z faktury do pěti dolarů odebere deset dolarů.

  15. Aktualizujte while blok kódu následujícím způsobem:

    while ((changeNeeded > 4) && (cashTill[1] > 0))
    {
        cashTill[1]--;
        changeNeeded -= 5;
        Console.WriteLine("\t A five");
    }    
    
  16. Uložte soubor Program.cs.

Kontrola práce

V této úloze spustíte aplikaci a ověříte, že aktualizovaný kód funguje podle očekávání.

  1. V nabídce Spustit editoru Visual Studio Code vyberte Odebrat všechny zarážky.

  2. V nabídce Spustit vyberte Spustit ladění.

  3. Zkontrolujte výstup na panelu TERMINAL.

  4. Ověřte, že se hlášená hodnota do té doby rovná očekávané hodnotě do:

    Konečný zůstatek vypočítaný MakeChange podle zůstatku a zůstatek udržovaný v výpisech nejvyšší úrovně se zobrazí v dolní části výstupu. Příklad:

    Transaction successfully completed.
    The till has 452 dollars
    Expected till value: 452
    
    
    Press the Enter key to exit
    

    Aplikace náhodně generuje náklady na nákupní položky. Proto se hodnoty dokazované ve výstupu liší. Pokud jsou obě hodnoty stejné, úspěšně jste vyřešili problém s logikou.