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.
În acest material
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.
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
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.
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.
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!.
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.
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.
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ă.
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.
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.
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.
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.
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.