Oefening: een C#-consoletoepassing controleren en testen met voorbeeldgegevens

Voltooid

In deze oefening controleert en test u de code in het Starter-project, isoleert en lost u een logisch probleem op en controleert u vervolgens of uw bijgewerkte toepassing werkt zoals verwacht.

Tijdens deze oefening voert u de volgende taken uit:

  1. Codebeoordeling: controleer de inhoud van het Program.cs-bestand.

    De Program.cs bevat de volgende codesecties:

    • Instructies op het hoogste niveau: met de instructies op het hoogste niveau wordt een reeks transacties gesimuleerd met behulp van een matrix van testData of een groter aantal willekeurig gegenereerde transacties.
    • LoadTillEachMorning: de LoadTillEachMorning methode wordt gebruikt om de kassa te configureren tot een vooraf gedefinieerd aantal facturen in elke benaming.
    • MakeChange: de MakeChange methode wordt gebruikt voor het beheren van het geld tot tijdens aankooptransacties.
    • LogTillStatus: de LogTillStatus methode wordt gebruikt om het aantal facturen van elke benaming weer te geven die momenteel in de till staan.
    • TillAmountSummary: de TillAmountSummary methode wordt gebruikt om een bericht weer te geven met de hoeveelheid geld in de kassa.
  2. Initiƫle tests: controleer of MakeChange het geld goed wordt gesaldi totdat u de testData matrix gebruikt om transacties te simuleren.

  3. Code-foutopsporing: een logicaprobleem isoleren en corrigeren dat wordt weergegeven bij het gebruik van willekeurig gegenereerde gegevens.

  4. Verificatietest: voer een verificatietest uit op de code die u in deze oefening ontwikkelt.

De inhoud van het Program.cs-bestand controleren

In deze taak voltooit u een overzicht van de Starter-projectcode. Het bestand Program.cs bevat een toepassing waarmee de voorwaarden voor dagelijkse transacties worden gesimuleerd. De toepassing roept de MakeChange methode aan voor het beheren van het geld tot elke transactie. Andere methoden worden gebruikt om de till te initialiseren en rapportageberichten te genereren.

  1. Zorg ervoor dat de map GuidedProject is geopend in Visual Studio Code.

  2. Vouw in de VERKENNER-weergave de mappen GuidedProject en Starter uit.

    De map Starter bevat de voorbeeldtoepassing voor deze begeleide projectmodule.

  3. Open het Program.cs-bestand in de Visual Studio Code-editor.

  4. Selecteer Opdrachtpalet in het menu Beeld.

  5. Voer bij de opdrachtprompt .net in: g en selecteer vervolgens .NET: Assets genereren voor build en foutopsporing.

  6. Selecteer het Starter-project in de prompt Het project selecteren om te starten.

    Het launch.json-bestand dat wordt gemaakt, bevat een configuratie voor het Starter-project.

  7. Neem enkele minuten de tijd om de instructies op het hoogste niveau voor deze toepassing te bekijken:

    /*
    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);
    

    Met de instructies op het hoogste niveau worden de volgende taken uitgevoerd:

    • Hiermee configureert u de toepassingsgegevens en omgevingsvariabelen die worden gebruikt om de MakeChange methode te testen.
    • Roept de LoadTillEachMorning(), LogTillStatus()en TillAmountSummary() methoden aan om het geld voor te bereiden tot en statusberichten af te drukken naar de console.
    • Maakt gebruik van een while lus om een reeks transacties te simuleren.
    • Roept de MakeChange methode aan vanuit het codeblok van de while lus.
    • Rapporteert de status van het geld tot na elke transactie.

    Notitie

    De instructies op het hoogste niveau bevatten een Console.ReadLine() instructie. Het launch.json bestand moet worden bijgewerkt voordat er fouten worden opgespoord.

  8. Neem even de tijd om de LoadTillEachMorning() methode te controleren.

    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. Neem een paar minuten de tijd om de MakeChange() methode te controleren.

    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;
    }
    

    De MakeChange methode beheert het geld tot tijdens elke aankooptransactie. Het transactieproces is afhankelijk van de volgende resources en voorwaarden:

    • Contante transactie: De MakeChange methode accepteert een contante betaling van de klant en bepaalt vervolgens hoeveel facturen van elke benaming moeten worden geretourneerd aan de klant in wijziging. MakeChange moet eerst ervoor zorgen dat de klant voldoende geld heeft verstrekt om de transactie te dekken. Als de betaling voldoende is, begint het proces "wijziging aanbrengen" met de grootste factuurbenomining en werkt het af op de kleinste benaming. In elke fase MakeChange zorgt u ervoor dat de huidige benaming kleiner is dan de verschuldigde wijziging. MakeChange zorgt er ook voor dat een factuur van de vereiste benaming beschikbaar is in de till voordat deze wordt toegevoegd aan de wijziging die aan de klant is geretourneerd.

    • Invoerparameters: De MakeChange methode gebruikt de volgende invoerparameters:

      • Een geheel getal dat de kosten vertegenwoordigt van het item dat wordt gekocht: itemCost
      • Een matrix met gehele getallen met het aantal facturen in de till voor elke benaming: cashTill
      • De betaling die door de klant wordt aangeboden, waarbij het aantal facturen voor elke benaming afzonderlijk wordt opgegeven: paymentTwenties, paymentTens, , , paymentFivespaymentOnes
    • Contant geld dat beschikbaar is tot: De rekeningen die als betaling door de klant worden aangeboden, moeten worden opgenomen in de rekeningen van elke benaming die beschikbaar zijn voor het aanbrengen van wijzigingen.

    • Wijziging die aan de klant is verschuldigd: de wijziging die aan de klant is verschuldigd, wordt berekend met behulp van het bedrag dat door de klant wordt betaald, minus de kosten van het artikel.

    • Onderbetalen: Als de klant onvoldoende betaling heeft verstrekt, MakeChange retourneert u een beschrijvend bericht en wordt de transactie geannuleerd.

    • Onvoldoende tot: Als de till geen exacte wijziging kan aanbrengen, MakeChange retourneert u een beschrijvend bericht en wordt de transactie geannuleerd.

  10. Neem even de tijd om de LogTillStatus() methode te controleren.

    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();
    }
    

    De LogTillStatus methode gebruikt de cashTill matrix om de huidige inhoud van de till te rapporteren.

  11. Neem even de tijd om de TillAmountSummary() methode te controleren.

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

    De TillAmountSummary methode gebruikt de matrix voor het cashTill berekenen van het huidige cash balance dat beschikbaar is in till.

Hiermee voltooit u uw beoordeling van het bestaande codeproject.

MakeChange Controleer of het geld goed wordt beheerd bij het gebruik van de testData matrix

In deze taak simuleert u transacties met behulp van de testData matrix en controleert u of MakeChange het geld in balans is gebracht totdat.

  1. Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.

  2. U ziet dat er een IOException fout optreedt.

    De FOUTOPSPORINGSCONSOLE biedt geen ondersteuning Console.Clear() voor of Console.ReadLine() methoden. U moet het launch.json-bestand bijwerken voordat u fouten opspoort.

  3. Selecteer Stoppen op de werkbalk Foutopsporing.

  4. Gebruik de EXPLORER-weergave om het bestand launch.json te openen.

  5. Werk in het launch.json-bestand het console kenmerk als volgt bij:

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

    De standaardwaarde voor het console kenmerk is internalConsole, die wordt uitgelijnd op het paneel DEBUG CONSOLE. Helaas biedt het deelvenster DEBUG CONSOLE geen ondersteuning voor sommige consolemethoden. De integratedTerminal instelling wordt uitgelijnd op het TERMINAL-deelvenster, dat ondersteuning biedt voor consoleinvoer en -uitvoer.

  6. Sla uw wijzigingen op in het launch.json-bestand.

  7. Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.

  8. Controleer de uitvoer die door de toepassing is gegenereerd in het TERMINAL-deelvenster.

    Schakel over van het paneel DEBUG CONSOLE naar het TERMINAL-deelvenster om de uitvoer te controleren.

  9. U ziet dat MakeChange het saldo van de till met succes wordt afgeslagen bij het gebruik van de testData matrix om transacties te simuleren.

    De volgende regels worden onder aan de gerapporteerde uitvoer weergegeven:

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

    U ziet dat de gerapporteerde en verwachte till-waarden beide 551 zijn.

  10. Druk op Enter om de toepassing af te sluiten.

Logische problemen identificeren en oplossen

In deze taak gebruikt u gesimuleerde transacties om een probleem met codelogica beschikbaar te maken en gebruikt u vervolgens de hulpprogramma's voor foutopsporingsprogramma's van Visual Studio Code om het probleem te isoleren en op te lossen.

  1. Als u de code wilt uitvoeren met behulp van willekeurig gegenereerde transacties, wijzigt u de waarde die is toegewezen aan useTestDatafalse.

    U vindt de useTestData variabele bovenaan de instructies op het hoogste niveau.

  2. Sla het Program.cs-bestand op en voer de toepassing uit in het foutopsporingsprogramma.

  3. Controleer de uitvoer in het TERMINAL-deelvenster.

  4. Let op de discrepantie in de till balance.

    Het uiteindelijke saldo dat wordt berekend door MakeChange en het saldo dat in de instructies op het hoogste niveau wordt bewaard, worden onder aan de uitvoer gerapporteerd. Bijvoorbeeld:

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

    Notitie

    De toepassing genereert willekeurig de kosten van aankoopitems. Daarom zijn de till-waarden die in uw uitvoer zijn gerapporteerd, verschillend.

  5. Druk op Enter om de toepassing af te sluiten.

  6. Sluit het TERMINAL-deelvenster.

Fouten opsporen in de code

In deze taak gebruikt u de hulpprogramma's voor foutopsporingsprogramma's van Visual Studio Code om het logische probleem te isoleren en vervolgens op te lossen.

  1. Zoek aan het einde van de instructies op het hoogste niveau de volgende coderegel:

    Console.WriteLine();
    
  2. Stel een onderbrekingspunt in op de geselecteerde coderegel.

  3. Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.

  4. U ziet dat de uitvoering van code wordt onderbroken op het onderbrekingspunt.

  5. Selecteer Stap in op de werkbalk Besturingselementen voor foutopsporing.

  6. Controleer de uitvoer in het TERMINAL-deelvenster.

  7. Als de gerapporteerde en verwachte waarden gelijk zijn, selecteert u Doorgaan op de werkbalk Besturingselementen voor foutopsporing.

  8. Herhaal de vorige stap totdat u een discrepantie ziet tussen de gerapporteerde en verwachte waarden.

  9. Zodra u een discrepantie ziet, neemt u een minuut de tijd om de details van de transactie te bekijken.

  10. U ziet dat de gerapporteerde contanten die zijn ontvangen en gewijzigd correct zijn, maar de till is kort met vijf dollar.

    Dit tekort geeft aan dat de cashTill matrix onjuist wordt bijgewerkt, ook al is de rapportage juist.

  11. Stop de foutopsporingssessie en sluit het TERMINAL-deelvenster.

  12. Schuif naar de onderkant van de MakeChange methode.

    De while instructies die worden gebruikt om wijzigingen aan te brengen, bevinden zich aan het einde van de MakeChange methode.

  13. Controleer de codeblokken van de while instructie die worden gebruikt om wijzigingen aan te brengen.

    Omdat de till met vijf dollar is uitgeschakeld, bevindt het probleem zich waarschijnlijk in het while codeblok dat wordt gebruikt om vijf dollar rekeningen te retourneren.

  14. Let op de volgende code:

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

    De cashTill[] matrix wordt gebruikt om het aantal facturen op te slaan van elke benaming die momenteel beschikbaar is. Matrixelement 1 wordt gebruikt om het aantal facturen van vijf dollar in de till te beheren. De expressie in de while instructie verwijst naar de juiste manier cashTill[1] . De instructie in het codeblok wordt echter afgebouwd cashTill[2] in plaats cashTill[1]van . Het opgeven van een indexwaarde betekent 2 dat een factuur van tien dollar wordt verwijderd uit de tot en met een factuur van vijf dollar.

  15. Werk het while codeblok als volgt bij:

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

Controleer uw werk

In deze taak voert u uw toepassing uit en controleert u of de bijgewerkte code werkt zoals bedoeld.

  1. Selecteer In het menu Uitvoeren van Visual Studio Code alle onderbrekingspunten verwijderen.

  2. Selecteer in het menu Uitvoeren de foutopsporing starten.

  3. Controleer de uitvoer in het TERMINAL-deelvenster.

  4. Controleer of de gerapporteerde till-waarde gelijk is aan de verwachte till-waarde:

    Het uiteindelijke saldo dat wordt berekend door MakeChange en het saldo dat in de instructies op het hoogste niveau wordt bewaard, worden onder aan de uitvoer gerapporteerd. Bijvoorbeeld:

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

    De toepassing genereert willekeurig de kosten van aankoopitems. Daarom zijn de till-waarden die in uw uitvoer zijn gerapporteerd, verschillend. Zolang de twee waarden gelijk zijn, hebt u het probleem opgelost.