C#: atestat și pregătire ONTI

C#: transformă cerințele în teste de acceptare

Învață să transformi o temă de proiect în cerințe verificabile. Construiește exemple de acceptare pentru un împrumut și urmărește ce dovedește fiecare test.

Tema „o bibliotecă” nu spune suficient ca să poți începe implementarea. Cine folosește aplicația? Ce informații introduce? Când este permis un împrumut? În această lecție transformăm o temă generală într-o operație cu rezultat observabil. Regula de lucru este simplă: fiecare cerință trebuie să aibă cel puțin un exemplu în care reușește și unul în care este refuzată.

Cum lucrezi cu exemplul

Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

Definim o singură operație: elevul poate împrumuta o carte dacă există un exemplar disponibil și are mai puțin de trei împrumuturi active. Metoda CanBorrow primește numai cele două numere. Nu citește TextBox și nu afișează MessageBox. Interfața va colecta datele și va interpreta rezultatul, iar regula poate fi testată fără fereastră.

Separă precondițiile de rezultat. Numerele negative nu reprezintă stări valide ale bibliotecii, deci metoda aruncă ArgumentOutOfRangeException. Pentru o stare validă, refuzul este un rezultat normal, false. Nu amesteca o greșeală de programare cu lipsa unui exemplar. Această diferență va ghida mesajele din interfață.

Exemplu și rezultat așteptat

Pentru un exemplar și două împrumuturi active, răspunsul este true. Pentru zero exemplare și două împrumuturi, răspunsul este false. Pentru un exemplar și trei împrumuturi, este tot false. Acestea sunt trei motive distincte; un singur test favorabil nu le acoperă. Programul verifică suplimentar granița zero și o intrare negativă, apoi afișează 5 verificari trecute.

Schemă pentru lecția 2: 1 exemplar disponibil; 2 împrumuturi active; 1 > 0 și 2 < 3; Rezultat: permis.1 exemplar disponibil → 2 împrumuturi active → 1 > 0 și 2 < 3 → Rezultat: permis.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Program {
    static bool CanBorrow(int available, int active) {
        if (available < 0 || active < 0) throw new ArgumentOutOfRangeException();
        return available > 0 && active < 3;
    }
    static void Check(bool ok) { if (!ok) throw new Exception("Test esuat"); }
    static void Main() {
        Check(CanBorrow(1, 2)); Check(!CanBorrow(0, 2));
        Check(!CanBorrow(1, 3)); Check(CanBorrow(1, 0));
        bool rejected = false;
        try { CanBorrow(-1, 0); } catch (ArgumentOutOfRangeException) { rejected = true; }
        Check(rejected); Console.WriteLine("5 verificari trecute");
    }
}

Rezultatul programului:

5 verificari trecute

Greșeli și limite

Un buton care afișează mereu „Succes” nu demonstrează cerința. Nici faptul că fereastra se deschide nu dovedește că datele se salvează. Scrie tabelul cerință, acțiune, rezultat, dovadă înainte de cod. La prezentarea proiectului vei putea urmări același tabel. Păstrează cerințele suplimentare într-o listă separată, ca să nu destabilizezi funcția de bază chiar înaintea predării.

Exersează

Adaugă o a doua regulă: un cititor suspendat nu poate împrumuta. Introdu un parametru bool și adaugă două teste în care toate celelalte condiții sunt identice. Rezultatele trebuie să difere numai după suspendare. Scrie un test de acceptare pentru interfață: după un refuz, numărul exemplarelor disponibile trebuie să rămână neschimbat. Explică de ce acest test nu poate fi înlocuit doar cu verificarea textului mesajului.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: mediul de lucru pentru aplicații desktop

Lecția următoare: C#: depanare cu breakpoint și starea programului.

Referință: documentația Microsoft.

Atelier pe Mac: de la cerință la test și depanare

Construiești și modifici efectiv programul din această lecție în Visual Studio Code. Capturile de mai jos provin din rularea pe un Mac cu Apple Silicon, .NET SDK 10.0.201 și extensia Microsoft C# 2.160.4. Vei reproduce regula pentru cititorul suspendat, inclusiv testul care eșuează înainte de corecție.

Descarcă atelierul pentru Mac, cu proiectul și cele trei etape de cod. Arhiva conține versiunea finală în AtelierCSharp/Program.cs. Pentru a lucra de la început, folosește etapele din stages. Aceasta este o aplicație de consolă .NET 10. Proiectele Windows Forms, Access/OleDb și Web Forms din celelalte lecții au propriile cerințe Windows.

1. Pregătește editorul și extensia C#

Descarcă Visual Studio Code pentru macOS, dacă nu este deja instalat. Deschide Extensions și caută extensia C#, publicată de Microsoft, cu identificatorul ms-dotnettools.csharp. Instaleaz-o. În captura noastră, butonul Uninstall confirmă că extensia este instalată. Atelierul folosește extensia C# și fișiere explicite de depanare.

Extensia C# de la Microsoft este instalată în profilul Atelier CSharp din Visual Studio Code.Pasul 1. Verifică editorul extensiei: Microsoft, identificator ms-dotnettools.csharp.Mărește schema ↗

2. Instalează și verifică SDK-ul .NET

Din pagina oficială .NET 10, alege SDK, macOS, Arm64 pentru Apple Silicon sau x64 pentru un Mac Intel. SDK-ul include instrumentele de compilare. Urmează instrucțiunile Microsoft pentru macOS, apoi redeschide terminalul. În VS Code, alege Terminal > New Terminal și execută:

dotnet --version

În demonstrație apare 10.0.201. O altă versiune compatibilă din familia 10 poate afișa alt număr. Dacă apare command not found, verifică instalarea și calea către executabil înainte să continui. Pentru instalarea manuală în $HOME/.dotnet, poți verifica direct "$HOME/.dotnet/dotnet" --version.

Terminalul integrat afișează versiunea 10.0.201 după comanda dotnet --version.Pasul 2. Numărul de versiune confirmă că terminalul găsește SDK-ul.Mărește schema ↗

3. Creează proiectul de consolă

Pentru a reproduce crearea de la zero, deschide în VS Code un director gol numit AtelierCSharp. În terminalul acelui director, rulează comanda următoare. Nu o executa peste proiectul descărcat: acesta este deja creat.

dotnet new console --framework net10.0 --use-program-main

În Explorer apar AtelierCSharp.csproj și Program.cs. Mesajul Restore succeeded confirmă pregătirea proiectului. Deschide Program.cs; pentru moment conține mesajul Hello, World!.

Explorer afișează proiectul AtelierCSharp și Program.cs, iar terminalul confirmă crearea proiectului și Restore succeeded.Pasul 3. Fișierul csproj descrie proiectul, iar Program.cs conține programul.Mărește schema ↗

4. Rulează primul program

În același terminal execută dotnet run. Compilatorul construiește programul și îl pornește. Rezultatul așteptat este exact Hello, World!. Dacă ai deschis direct arhiva cu soluția finală, vei vedea cele șapte verificări, nu mesajul șablonului.

Program.cs conține Console.WriteLine cu Hello, World!, iar terminalul afișează același mesaj după dotnet run.Pasul 4. Prima rulare verifică funcționarea întregului mediu.Mărește schema ↗

5. Introdu programul inițial și verifică cele cinci cazuri

Înlocuiește conținutul lui Program.cs cu cel din stages/01-initial.cs.txt și salvează cu Cmd+S. Este varianta formatată a exemplului din lecție: verifică stocul, limita de împrumuturi și respingerea datelor negative. Rulează din nou dotnet run. Rezultatul trebuie să fie 5 verificari trecute.

Codul CanBorrow folosește stocul și numărul de împrumuturi, iar terminalul confirmă cinci verificări trecute.Pasul 5. Stabilește un rezultat inițial corect înainte de a modifica regula.Mărește schema ↗

6. Adaugă două teste și observă eșecul așteptat

Cerința este: un cititor suspendat nu poate împrumuta. Adaugă parametrul opțional bool suspended = false la CanBorrow. Valoarea implicită păstrează apelurile existente. După Check(rejected), adaugă:

Check(CanBorrow(1, 2, false));
Check(!CanBorrow(1, 2, true));

Schimbă mesajul final în 7 verificari trecute. Primul test verifică un cititor activ, al doilea unul suspendat, cu același stoc și același număr de împrumuturi. În această etapă păstrează intenționat expresia veche din return. Codul intermediar complet se află în stages/02-test-rosu.cs.txt.

Salvează și rulează dotnet run. Programul se oprește cu Test esuat, iar urma execuției indică testul de la linia 28. Nu este o eroare de instalare: programul se compilează, dar permite încă împrumutul cititorului suspendat. Check(!CanBorrow(1, 2, true)) primește astfel valoarea falsă.

Terminalul afișează excepția Test esuat și linia 28 din Main, corespunzătoare cazului cu suspended egal true.Pasul 6. Testul detectează lipsa regulii pentru cititorul suspendat.Mărește schema ↗

7. Implementează regula și rulează toate testele

Completează expresia din CanBorrow:

return available > 0 && active < 3 && !suspended;

Operatorul ! inversează valoarea booleană: !suspended este adevărat numai pentru un cititor care nu este suspendat. Salvează și rulează dotnet run. Acum trebuie să apară 7 verificari trecute. Compară rezultatul tău cu stages/03-final.cs.txt. Nu șterge testul care a descoperit problema.

Expresia return include condiția !suspended, iar terminalul confirmă șapte verificări trecute.Pasul 7. Corecția satisface cerința nouă și păstrează testele inițiale.Mărește schema ↗

8. Oprește programul la un breakpoint

Arhiva include .vscode/launch.json și .vscode/tasks.json. Dacă ai creat proiectul de la zero, copiază acest director în proiectul tău. Apasă în marginea din stânga liniei cu return, pentru a adăuga punctul roșu. În Run and Debug, alege Atelier C#: depanare și pornește cu F5. Pe unele tastaturi Mac folosești Fn+F5 sau butonul Start Debugging.

La prima oprire, deschide Variables > Locals. Valorile sunt available = 1, active = 2, suspended = false. În Debug Console, introdu expresia din return, fără cuvântul return și fără punct și virgulă. Rezultatul este true.

Debuggerul este oprit la linia 9; Locals arată available 1, active 2 și suspended false, iar expresia evaluată în Debug Console este true.Pasul 8. Breakpoint-ul permite verificarea valorilor înainte de return.Mărește schema ↗

9. Compară același stoc cu un cititor suspendat

Apasă Continue, cu F5, de încă cinci ori pentru a ajunge la ultimul apel valid al lui CanBorrow. Apelul cu stoc negativ aruncă excepția înainte de linia cu breakpoint; testul o prinde intenționat. La ultima oprire vezi available = 1, active = 2, suspended = true. Evaluează din nou expresia în Debug Console: acum rezultatul este false.

Locals arată available 1, active 2 și suspended true; aceeași expresie din Debug Console produce false.Pasul 9. Diferența de rezultat vine din starea cititorului, nu din stoc.Mărește schema ↗

10. Avansează un pas și termină execuția

Apasă Step Over, cu F10 sau Fn+F10. Marcajul galben avansează după expresia return. Apasă apoi Continue pentru a termina. În rularea documentată, procesul s-a încheiat cu codul 0, iar toate cele șapte verificări au trecut. Poți elimina breakpoint-ul printr-un nou clic în margine.

Marcajul galben al debuggerului a avansat la acolada de închidere după executarea expresiei return.Pasul 10. Step Over execută instrucțiunea curentă și permite urmărirea pas cu pas.Mărește schema ↗

Dacă terminalul vede SDK-ul, dar extensia nu îl găsește

În demonstrație, SDK-ul a fost instalat separat în directorul utilizatorului, $HOME/.dotnet. Extensia găsea inițial o altă instalare, care avea numai runtime. Am indicat executabilul corect prin dotnetAcquisitionExtension.existingDotnetPath, pentru extensionId egal cu ms-dotnettools.csharp, și am configurat DOTNET_ROOT, DOTNET_HOST_PATH și PATH în dotnet.server.environmentVariables. Valorile trebuie să indice instalarea ta, nu o cale copiată de pe alt calculator.

După corectare, deschide Command Palette cu Cmd+Shift+P și execută Developer: Reload Window. Verifică în bara de stare că proiectul este recunoscut ca AtelierCSharp (net10.0). Pentru instalarea standard, consultă întâi rezolvarea problemelor extensiei C# și configurarea .NET pe macOS. Capturile arată mediul după remediere; rularea în terminal și depanarea au fost verificate separat.

Întrebări frecvente

Ce este un test de acceptare?

O verificare observabilă a unei cerințe: acțiune, date și rezultat așteptat.

De ce nu pun regula în Click?

Separarea permite testarea fără interfață și reutilizarea regulii în alte ecrane.

Un caz fericit este suficient?

Nu. Ai nevoie și de refuzuri, valori de frontieră și verificarea stării după operație.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →