Cvičení – kontrola a otestování konzolové aplikace jazyka C# pomocí ukázkových dat
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:
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
testDatanebo většího počtu náhodně generovaných transakcí. - LoadTillEachMorning:
LoadTillEachMorningmetoda se používá ke konfiguraci pokladny do předdefinovaného počtu faktur v každé nominální hodnotě. - MakeChange:
MakeChangemetoda se používá ke správě hotovosti do doby, než dojde k nákupu transakcí. - LogTillStatus:
LogTillStatusMetoda se používá k zobrazení počtu faktur každé nominální hodnoty, které jsou aktuálně v době do. - TillAmountSummary:
TillAmountSummarymetoda se používá zobrazení zprávy s částkou hotovosti v till.
- Příkazy nejvyšší úrovně: příkazy nejvyšší úrovně simulují řadu transakcí pomocí pole
Počáteční testování: Ověřte, že
MakeChangepři použitítestDatapole k simulaci transakcí úspěšně vyrovná peníze.Ladění kódu: Izolujte a opravte problém logiky, který se zobrazí při použití náhodně generovaných dat.
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.
Ujistěte se, že je složka GuidedProject otevřená v editoru Visual Studio Code.
V zobrazení PRŮZKUMNÍK rozbalte složky GuidedProject a Starter .
Složka Starter obsahuje ukázkovou aplikaci pro tento modul projektu s asistencí.
Otevřete soubor Program.cs v editoru Visual Studio Code.
V nabídce Zobrazit vyberte paletu příkazů.
Na příkazovém řádku zadejte .net: g a pak vyberte .NET: Generovat prostředky pro sestavení a ladění.
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.
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í
MakeChangemetody. -
LoadTillEachMorning()Volá ,LogTillStatus()aTillAmountSummary()metody připravit peníze do a vytisknou stavové zprávy do konzoly. -
whilePomocí smyčky simuluje řadu transakcí. - Volá metodu
MakeChangez bloku kódu smyčkywhile. - Hlásí stav peněz až po každé transakci.
Poznámka:
Příkazy nejvyšší úrovně zahrnují
Console.ReadLine()příkaz. Předlaunch.jsonladěním bude nutné soubor aktualizovat.- Nakonfiguruje data aplikace a proměnné prostředí použité k otestování
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]; }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
MakeChangespravuje peníze do každé nákupní transakce. Proces transakce spoléhá na následující prostředky a podmínky:Hotovostní transakce: Metoda
MakeChangepř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ě.MakeChangemusí 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,MakeChangeaby aktuální nominální hodnota byla menší než změna.MakeChangetaké 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
MakeChangepouží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
- Celé číslo představující náklady na zakoupenou položku:
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,
MakeChangevrátí popisnou zprávu a transakce se zruší.Nedostatek do: Pokud do té doby nelze provést přesnou změnu,
MakeChangevrátí popisnou zprávu a transakce je zrušena.
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
LogTillStatuspoužívácashTillpole k hlášení aktuálního obsahu do.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
TillAmountSummarypoužívácashTillmatici 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.
V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.
Všimněte si, že dojde k
IOExceptionchybě.KONZOLa DEBUG nepodporuje
Console.Clear()aniConsole.ReadLine()metody. Před laděním musíte aktualizovat soubor launch.json.Na panelu nástrojů Ladění vyberte Zastavit.
Pomocí zobrazení PRŮZKUMNÍK otevřete soubor launch.json.
V souboru launch.json aktualizujte
consoleatribut 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
consolejeinternalConsole, která odpovídá panelu KONZOLY LADĚNÍ. Panel KONZOLY LADĚNÍ bohužel nepodporuje některé metody konzoly. NastaveníintegratedTerminalse zarovná na panel TERMINÁL, který podporuje vstup a výstup konzoly.Uložte změny do souboru launch.json.
V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.
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.
Všimněte si, že
MakeChangepři použitítestDatapole 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 exitVšimněte si, že hlášené a očekávané hodnoty jsou 551.
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.
Chcete-li spustit kód pomocí náhodně generovaných transakcí, změňte hodnotu přiřazenou k
useTestDatafalse.Proměnnou
useTestDatanajdete v horní části příkazů nejvyšší úrovně.Uložte soubor Program.cs a spusťte aplikaci v ladicím programu.
Zkontrolujte výstup na panelu TERMINAL.
Všimnětesich
Konečný zůstatek vypočítaný
MakeChangepodle 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 exitPoznámka:
Aplikace náhodně generuje náklady na nákupní položky. Proto se hodnoty dokazované ve výstupu liší.
Aplikaci ukončíte stisknutím klávesy Enter.
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.
Na konci příkazů nejvyšší úrovně vyhledejte následující řádek kódu:
Console.WriteLine();Nastavte zarážku na vybraném řádku kódu.
V nabídce Spustit editor Visual Studio Code vyberte Spustit ladění.
Všimněte si, že provádění kódu se pozastaví na zarážce.
Na panelu nástrojů Ovládací prvky ladění vyberte Krok do.
Zkontrolujte výstup na panelu TERMINAL.
Pokud jsou hlášené a očekávané hodnoty stejné, vyberte na panelu nástrojů Ovládací prvky ladění možnost Pokračovat.
Opakujte předchozí krok, dokud neuvidíte nesrovnalosti mezi hlášenými a očekávanými hodnotami.
Jakmile uvidíte nesrovnalosti, prohlédněte si podrobnosti transakce za minutu.
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
cashTillpole je aktualizováno nesprávně, i když je hlášení správné.Zastavte ladicí relaci a zavřete panel TERMINÁL.
Posuňte se na konec
MakeChangemetody.Příkazy
whilepoužité k provedení změny se nacházejí na konciMakeChangemetody.whileZkontrolujte 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
whilebloku kódu, který se používá k vrácení pěti dolarových faktur.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. Prvek1Array se používá ke správě počtu pěti dolarových faktur v do. Výraz vwhilepříkazu odkazujecashTill[1]správně. Příkaz uvnitř bloku kódu se ale dekrementujecashTill[2]místocashTill[1]. Určení indexové2hodnoty znamená, že se z faktury do pěti dolarů odebere deset dolarů.Aktualizujte
whileblok kódu následujícím způsobem:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }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í.
V nabídce Spustit editoru Visual Studio Code vyberte Odebrat všechny zarážky.
V nabídce Spustit vyberte Spustit ladění.
Zkontrolujte výstup na panelu TERMINAL.
Ověřte, že se hlášená hodnota do té doby rovná očekávané hodnotě do:
Konečný zůstatek vypočítaný
MakeChangepodle 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 exitAplikace 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.