آزمون APIها و نمایه اصطلاحات
منبع: Coding Clean, Reliable, and Safe REST APIs with ASP.NET Core 8 — Anthony Giretti
اعتبار ترجمه: ترجمه با کمک هوش مصنوعی
فروش یا انتشار این ترجمه منوط به داشتن مجوز لازم از صاحب حقوق اثر است.
فصل ۱۱ — آزمون APIها
Testing خطاهای مربوط به کیفیت نرمافزار را آشکار میکند؛ چه آزمون Functional باشد، چه Performance را بسنجد یا تجربهٔ کاربر را ارزیابی کند. آزمون بخش ضروری توسعهٔ نرمافزار است و نتیجهٔ آن به تیم اجازه میدهد ایرادها را پیش از رسیدن به کاربر نهایی اصلاح کند.
این فصل دو موضوع را پوشش میدهد:
- مقدمهای بر Testing
- Unit Testing (آزمون واحد) کارآمد
مقدمهای بر Testing
بهتر است Testing از مراحل ابتدایی چرخهٔ توسعه شروع شود تا Bugها پیش از اثرگذاری بر کاربر نهایی پیدا و حذف شوند. انواع رایج آزمون که در منبع معرفی شدهاند:
- Unit Testing: یک Unit یا Component مستقل از نرمافزار بررسی میشود تا مشخص شود رفتار آن مطابق انتظار است.
- Integration Testing: بررسی میکند بخشهایی که جداگانه توسعه یافتهاند هنگام اتصال به هم درست کار میکنند؛ برای مثال کد پس از اتصال به Database.
- End-to-End Testing: کل سامانه از Interface تا رفتار عملیاتی نهایی بررسی میشود.
- Functional Testing: بر نتیجهٔ Functionality تمرکز دارد، نه جزئیات مکانیزم داخلی آن.
- Acceptance Testing: بررسی میکند برنامه با انتظارهای End User همخوان است.
- Performance Testing: یک Non-functional Test برای ارزیابی Stability و Speed زیر بار سنگین است.
- Smoke Testing: Functionهای حیاتی مانند Authentication را بهسرعت بررسی میکند.
نویسنده Unit Test و Integration Test را عمدتاً در مسئولیت Developer میداند؛ End-to-End ممکن است توسط Developer، DevOps یا QA خودکار شود و سایر آزمونها معمولاً با QA یا Client انجام میشوند. این فصل بر Unit Test تمرکز میکند.
Unit Testing کارآمد
Unit Test یک واحد کد را که System Under Test (SUT) نامیده میشود، معمولاً یک Function، جدا از Dependencyهای خارجی بررسی میکند. ویژگیهای آزمون خوب در منبع:
- Readable: با خواندن کد بهراحتی فهمیده شود.
- Specific: هر Test یک Behavior را بررسی کند و برای پوشش چند Scenario با Conditionهای پیچیده پر نشود.
- Fast: سریع اجرا شود؛ Isolation از Dependency خارجی معمولاً این ویژگی را ممکن میکند.
- Complete یا تقریباً کامل: پوشش بالا مطلوب است، اما آزمون ۱۰۰٪ کد همیشه عملی یا ارزشمند نیست. نویسنده هدفی مانند حداقل ۶۰٪ Code Coverage را واقعبینانهتر میداند و اشاره میکند برخی Configurationها بهتر است با Testهای سطح بالاتر پوشش داده شوند.
- Immediate: Testing از ابتدای Project شروع شود؛ در غیر این صورت معمولاً به تعویق میافتد.
ابزارهای مورد استفاده
برای پروژهٔ Unit Test، یک Class Library در Visual Studio ساخته و به Projectهای مورد آزمون Reference داده میشود. Packageهای نمونه:
Microsoft.NET.Test.Sdk: اجرای Unit Test در Solution .NET.
xunit: Test Framework.
xunit.runner.visualstudio: کشف Testهای xUnit توسط Visual Studio.
NSubstitute: Mocking Library.
AutoFixture: ساخت سریع Fake Data برای Propertyهای Object.
ExpectedObjects: مقایسهٔ Object بر اساس Value بهجای Reference.
شکل ۱۱-۱ — ساختار پروژهٔ Unit Test
آزمون گامبهگام یک SUT
SUT مثال، Function استاتیک GetCountries در کلاس CountryEndpoints است؛ همان جداسازی Endpoint که در فصل ۵ برای Testability بهتر انجام شد.
using AspNetCore8MinimalApis.Mapping.Interfaces;
using Domain.DTOs;
using Domain.Services;
namespace AspNetCore8MinimalApis.Endpoints;
public static class CountryEndpoints
{
public static async Task<IResult> GetCountries(int? pageIndex,
int? pageSize, ICountryMapper mapper,
ICountryService countryService)
{
var paging = new PagingDto
{
PageIndex = pageIndex.HasValue ? pageIndex.Value : 1,
PageSize = pageSize.HasValue ? pageSize.Value : 10
};
var countries = await countryService.GetAllAsync(paging);
return Results.Ok(mapper.Map(countries));
}
}
Listing 11-1 — کلاس CountryEndpoints و تابع GetCountries
مشخص کردن آنچه باید آزمون شود
GetCountries چهار حالت برای دو پارامتر Nullable دارد: هر دو Null، هیچکدام Null، فقط pageIndex Null، یا فقط pageSize Null. مطابق اصل «یک Behavior در هر Test»، چهار Test جداگانه منطقی است. منبع یک Scenario را با هر دو مقدار Null پیادهسازی میکند.
در این Scenario باید موارد زیر بررسی شوند:
- خروجی از نوع نتیجهٔ موفق و شامل همان Listی باشد که Mapper برمیگرداند.
- وقتی
pageIndex و pageSize Null هستند، Defaultهای ۱ و ۱۰ اعمال شوند.
GetAllAsync دقیقاً یک PagingDto با مقادیر درست دریافت کند؛ چون فقط درست بودن خروجی کافی نیست و ممکن است Function پارامترها را غلط مصرف کرده باشد.
- متد
Map دقیقاً List مربوط به CountryDto را که Service برگردانده دریافت کند.
بنابراین آزمون فقط Output نهایی را نمیسنجد؛ کل Behavior و Interactionهای مهم SUT را بررسی میکند.
ساخت Test Class
Convention منبع این است که هر Test Class فقط یک SUT را هدف بگیرد. بنابراین کلاس GetCountriesTests در پوشهای مانند CountriesTests قرار میگیرد و پسوند Tests برای خوانایی نامها استفاده میشود.
using AspNetCore8MinimalApis.Endpoints;
using AspNetCore8MinimalApis.Mapping.Interfaces;
using AspNetCore8MinimalApis.Models;
using AutoFixture;
using Domain.DTOs;
using Domain.Services;
using ExpectedObjects;
using Microsoft.AspNetCore.Http.HttpResults;
using NSubstitute;
using Xunit;
namespace UnitTests.Countries;
public class GetCountriesTests
{
public GetCountriesTests()
{
}
[Fact]
public async Task When_GetCountriesReceivesNullPagingParametersAndGetAllAsyncMethodReturnsCountries_ShouldFillUpDefaultPagingParametersAndReturnCountries()
{
// Arrange
// Act
// Assert
}
}
Listing 11-2 — اسکلت کلاس GetCountriesTests
Attribute [Fact] به xUnit و Microsoft Test SDK اعلام میکند این Function یک Unit Test است و باید در Test Explorer کشف شود.
شکل ۱۱-۲ — Test Explorer در Visual Studio و Testهای کشفشده
شکل ۱۱-۳ — ساختار پروژهٔ UnitTests
نام Test از Pattern توصیفی When{condition}_Should{expectedBehavior} پیروی میکند تا تنها با خواندن نام، Scenario و انتظار آزمون روشن باشد.
سه بخش مشهور AAA در بدنه Test:
- Arrange: ساخت ورودی، Mock و دادهٔ مورد انتظار.
- Act: اجرای SUT.
- Assert: بررسی خروجی و Interactionها.
پیادهسازی کامل Test
using AspNetCore8MinimalApis.Endpoints;
using AspNetCore8MinimalApis.Mapping.Interfaces;
using AspNetCore8MinimalApis.Models;
using AutoFixture;
using Domain.DTOs;
using Domain.Services;
using ExpectedObjects;
using Microsoft.AspNetCore.Http.HttpResults;
using NSubstitute;
using Xunit;
namespace UnitTests.Countries;
public class GetCountriesTests
{
private readonly ICountryMapper _countryMapper;
private readonly ICountryService _countryService;
private readonly Fixture _fixture;
public GetCountriesTests()
{
_countryMapper = Substitute.For<ICountryMapper>();
_countryService = Substitute.For<ICountryService>();
_fixture = new Fixture();
}
[Fact]
public async Task WhenGetCountriesReceivesNullPagingParametersAndGetAllAsyncMethodReturnsCountries_ShouldFillUpDefaultPagingParametersAndReturnCountries()
{
// Arrange
int? pageIndex = null;
int? pageSize = null;
var expectedPaging = new PagingDto
{
PageIndex = 1,
PageSize = 10
}.ToExpectedObject();
var countries = _fixture.CreateMany<CountryDto>(2).ToList();
var expectedCountries = countries.ToExpectedObject();
var mappedCountries = _fixture.CreateMany<Country>(2).ToList();
var expectedMappedCountries = mappedCountries.ToExpectedObject();
_countryService.GetAllAsync(Arg.Any<PagingDto>())
.Returns(x => countries);
_countryMapper.Map(Arg.Any<List<CountryDto>>())
.Returns(x => mappedCountries);
// Act
var result = (await CountryEndpoints.GetCountries(
pageIndex, pageSize, _countryMapper, _countryService))
as Ok<List<Country>>;
// Assert
expectedMappedCountries.ShouldEqual(result.Value);
await _countryService.Received(1).GetAllAsync(
Arg.Is<PagingDto>(x => expectedPaging.Matches(x)));
_countryMapper.Received(1).Map(
Arg.Is<List<CountryDto>>(x => expectedCountries.Matches(x)));
}
}
Listing 11-3 — پیادهسازی نهایی GetCountriesTests
Constructor
در Constructor، NSubstitute Instanceهای Fake برای ICountryMapper و ICountryService میسازد. Unit Test نباید برای آزمون این Function به Implementation واقعی Service یا Database متصل شود؛ Abstractionها Mock میشوند و Behavior مورد نیاز Test روی آنها تعریف میشود. Fixture از AutoFixture نیز برای تولید سریع Objectهای پرشده ساخته میشود.
xUnit برای هر Test Instance جدیدی از Test Class میسازد؛ بنابراین State فیلدهای Constructor میان Testها بهصورت مشترک باقی نمیماند.
Arrange
pageIndex و pageSize روی Null قرار میگیرند. PagingDto مورد انتظار با ۱ و ۱۰ ساخته و با ToExpectedObject برای مقایسهٔ Value آماده میشود. AutoFixture دو CountryDto و دو Country میسازد. رفتار Mockها طوری تعریف میشود که Service بدون توجه به ورودی، List اول را برگرداند و Mapper نیز List دوم را برگرداند.
هدف آزمون بررسی Mapping محتوای داخلی Objectها نیست؛ هدف آن است که مطمئن شود List برگرداندهشده از Service دقیقاً به Mapper پاس داده میشود و خروجی Mapper همان چیزی است که SUT در Response میگذارد.
Act
SUT با پارامترهای Null و دو Mock اجرا میشود و خروجی به Ok<List<Country>> Cast میشود.
Assert
ابتدا Value نتیجه با List مورد انتظار Mapper مقایسه میشود. سپس با Received(1) از NSubstitute بررسی میشود GetAllAsync و Map هرکدام دقیقاً یک بار فراخوانی شدهاند. Arg.Is<T> و Matches از ExpectedObjects نیز مقدار واقعی پارامترهای ارسالی به Mockها را با Objectهای مورد انتظار مقایسه میکنند.
اگر Cast به Ok<List<Country>> ناموفق باشد، Result به Null تبدیل میشود و Assert بعدی Test را Fail میکند؛ بنابراین نوع Response نیز بهطور غیرمستقیم کنترل میشود.
شکل ۱۱-۴ — Test Explorer پس از Passed شدن Unit Test
جمعبندی فصل و کتاب
نکتهٔ اصلی این فصل وابستگی به ابزار خاص نیست، بلکه فلسفهٔ آزمون است: SUT را Isolation کنید، فقط Output را نسنجید، Interactionها و مصرف درست پارامترها را نیز بررسی کنید و Testهای خوانا و سریع بنویسید. با همین الگو میتوان Scenarioهای دیگر را توسعه داد. با پایان این فصل، محتوای اصلی کتاب نیز به پایان میرسد.
نمایه
شمارهها در این نمایه، شمارهصفحههای چاپی منبع هستند و بدون تغییر حفظ شدهاند.
A
- Acceptance Testing (آزمون پذیرش)، 404
- Application Development (توسعهٔ برنامه): کسبوکار، 72؛ Clean Architecture، 74–86؛ مبانی، 71؛ برنامهٔ منطقی/ساختاریافته، 73؛ مهارت حل مسئله، 72؛ Paradigmهای برنامهنویسی، 73.
- Application Insights، 347–351، 355، 358، 361، 363، 364، 373، 376، 378.
- Application Performance Monitoring (APM)، 346–348، 358، 359، 363، 375.
- Application Programming Interface (API): ASP.NET Core 8، 44، 65–68؛ مستندسازی، 40؛ سفارشیسازی، 207، 208؛ Deprecated، 209، 210؛ توصیف Responseها، 210–212؛ Endpointها، 208، 209؛ گروهبندی Endpointها، 206، 207؛ NuGet Packageها، 191؛ OpenAPI Specification، 190؛ Swagger Documentation، 192–199؛ متد WithTag، 206؛ XML Comments، 199–205؛ Encapsulation، 213؛ Input Validation، 119؛ Testing، 403–417؛ Versioning، 39؛ Build، 179؛ Configuration، 178؛ اجرای Endpoint، 182–187؛ Headerها، 178–187؛ NewApiVersionSet، 180؛ Route Method، 187–190؛ WithApiVersionSet، 180؛ Web Interface، 53–64.
- Application Secret Management (مدیریت Secret برنامه)، 375؛ Production Databaseها، 375؛ Resourceها، 376؛ Sensitive Data، 376؛ Tenant Properties، 376، 377.
- Application Security (امنیت برنامه)، 385–401.
- ASP.NET Core 8، 91، 213: Action Filterها، 239–244؛ انواع برنامه، 44؛ appsettings.json، 51؛ Architecture، 47؛ Authentication/Authorization، 389–395؛ Caching، 326–342؛ CORS، 173–179؛ Data Access، 267؛ Dependency Injection، 47؛ Development Mode، 52؛ API Documentation، 190–212؛ Encapsulation/ساختار API، 214–219؛ Framework، 43؛ Fundamentals، 44؛ Input Validation، 119–129؛ launchSettings.json، 52، 53؛ Lifecycle، 47؛ Lifetime Configuration، 48، 49؛ Middleware Pipeline، 45؛ Middlewareها، 225–238؛ Minimal APIها، 65–68؛ MVC Controller، 49؛ Object Mapping، 129–135؛ Parameter Binding، 107؛ Program.cs، 44، 46؛ Rate Limiting، 243–259؛ Routing، 92–107؛ Scope Hierarchy، 50؛ Service Configuration، 45؛ Singleton/Scoped/Transient، 50؛ Web API، 54–64.
- Asynchronous Programming (برنامهنویسی ناهمگام)، 303: async/await، 304؛ CancellationToken، 306–310؛ CountryRepository، 307؛ GetAllAsync، 304؛ IMediaRepository، 310؛ MediaRepository، 308؛ SQL Exception، 308؛ Task<T>، 304؛ ToListAsync، 305.
- Authentication/Authorization، 389–395: فعالسازی، 390؛ Configuration، 389؛ Provider Encode/Decode، 394؛ GET Endpointها، 392؛ NuGet Package، 389؛ Program.cs، 390؛ Policy نوع SurveyCreator، 393.
- Azure Key Vault: appsettings.json، 380؛ AZURE_TENANT_ID، 379، 380؛ Manage User Secrets، 380، 381؛ Microsoft Account، 379؛ NuGet Packageها، 378؛ Program.cs، 382؛ بازیابی Secret، 383؛ ایجاد Secret، 378؛ secrets.json، 382.
B
- Bind Parameters: رجوع شود به Parameter Binding.
- Business Logic Layer (BLL)، 138، 270، 314، 332.
C
- Caching: Distributed Cache ـ مفهوم 337، Configuration 340، DistributedCachedCountryService 337–339، Providerها 336؛ In-Memory ـ CachedCountryService 332–334، CountryService 332، Decorator Pattern 331، Configuration 335، Workflow 331؛ OutputCache ـ Authorization Header 326، GET Endpoint 328، 330، Program.cs 327، Workflow 327؛ انواع Cache، 326.
- Certificate Authority (CA)، 30.
- Clean Architecture: Application Layerها، 75؛ Architecture، 74؛ Business Logic/Application Layer، 76؛ Coding Style، 83–86؛ Casing Convention، 85؛ Download Directory، 83؛ DownloadService.cs، 84؛ GetFileAsync، 84، 85؛ Principles، 86؛ Domain/Presentation Layer، 76؛ External Data Access، 75؛ Fundamentals، 74، 79؛ Infrastructure Layerها، 77، 78؛ Interfaceها و DI، 75؛ Layerها، 76؛ OOP Principles، 81–83؛ Single Responsibility، 80؛ Third-party Library/Framework، 75؛ Tools Layer، 77؛ User Interface، 75.
- Command-Line Interface (CLI)، 54.
- Create, Retrieve, Update, Delete (CRUD)، 33: Content Streaming، 169–171؛ CountryDto، 139؛ CountryMapper، 149؛ CountryPatchValidator، 150؛ DELETE Endpoint، 146؛ Download File، 151–155؛ Endpoint Implementation، 141–144؛ GET Endpoint، 145؛ HTTP Statusها، 136، 137؛ ICountryService، 139؛ PATCH، 148–151؛ POST، 144، 145؛ PUT، 147؛ Service Creation، 138–140؛ Upload File، 155–169؛ URL Naming، 37؛ Verb Manipulation، 135.
- Cross-Origin Resource Sharing (CORS)، 7، 91: AllowAll Policy، 174؛ AllowCredentials، 174؛ Configuration، 173؛ Elements، 175؛ Headerها، 172؛ HTTP Requestها، 172، 177؛ JavaScript Script، 176؛ Mozilla Documentation، 173؛ Restricted Configuration، 175.
- Cross-Site Request Forgery (CSRF)، 36، 112.
- Cross-Site Scripting (XSS)، 87، 120.
D
- Data Access (دسترسی به داده): Architecture، 269–271؛ Data Typeها، 267؛ EF Core؛ HttpClient/REST API، 294–301؛ HTTP Requestها، 269؛ Infrastructure Layerها، 270؛ SQL Queryها، 268، 269؛ Transient Errorها، 268.
- Data Transfer Objects (DTOs): Object Mapping، 130.
E
- Efficient Unit Testing: رجوع شود به Unit Testing.
- End-to-End Testing، 404.
- Entity Framework Core (EF Core): اتصال C# به Database ـ appsettings.json 276، Configuration 277، Demo Generation 279، Initial Migration 278، Migration History 280؛ CountryEntity، 273، 274؛ CountryRepository، 282، 283، 285؛ CountryService، 287، 288؛ Data Access، 271؛ DemoContext، 273، 275؛ Resilience ـ Documentation 281، SQL Connection Error 280، Transient Error 281؛ Solution سراسری ASP.NET Core، 292، 293؛ ICountryRepository، 281؛ Infrastructure.SQL، 272؛ NuGet Package Manager، 272؛ OnModelCreating، 274؛ Program.cs، 289–292؛ Projection، 287.
- Error Management (مدیریت خطا): DefaultExceptionHandler، 260، 261؛ External Resourceها، 259؛ GET /exception، 261، 262؛ IExceptionHandler، 259؛ Timeout Endpoint، 265؛ TimeOutExceptionHandler، 263–265.
- Extensible Markup Language (XML)، 2، 33، 35، 36، 54، 75، 199–204، 261.
F, G
H
- HTTP Strict Transport Security (HSTS)، 29–31.
- HyperText Markup Language (HTML)، 2، 24، 25، 27، 40، 89، 112، 120، 124، 196، 197، 203، 206، 342.
- Hypertext Transfer Protocol (HTTP)، 1: Characteristics، 3، 4؛ Client/Server، 1؛ CORS، 172–178؛ CRUD، 136، 137؛ Data Access، 269؛ HttpClient، 294–301؛ IHttpClientFactory، 295–297؛ IMediaRepository، 295، 297، 298؛ MediaRepository، 295؛ Polly، 298–301؛ Program.cs، 298؛ RetryPolicy، 299؛ Transient Error، 300؛ Form Data، 6؛ Handling Error، 28، 29؛ Header/Parameter، 4؛ HTTP/2 و HTTP/3، 342، 343؛ HTTPS/TLS/HSTS، 29–31؛ Implementation، 5؛ Request/Response Headerها، 12؛ Status Codeها، 8–12؛ Verbها، 6–8؛ Input Validation، 119؛ JSON Format، 31؛ Parameter Binding، 109؛ Parameterها، 27؛ Request Headerها، 13–19؛ Response Headerها، 19–22؛ Request/Response، 4، 5؛ REST؛ Routing Request، 92، 93؛ URI Response، 23–25؛ URL Protocolها، 26؛ Verb، 93، 94؛ Versionها، 2.
I
- Information Technology (IT)، 72، 79.
- Integration Testing، 214، 404.
- Internet Assigned Numbers Authority (IANA)، 152.
- Internet Engineering Task Force (IETF)، 2.
J
- JavaScript Object Notation (JSON)، 2: ASP.NET Core 8، 53؛ HTTP، 31؛ JWT؛ Media Type، 35، 36؛ Streaming، 324–326.
- JSON Web Token (JWT): AddSwaggerGen، 396؛ Authorize Button، 397؛ GET Endpointها، 398، 399؛ Headerها، 397؛ IHttpContextAccessor، 401؛ OIDC، 387؛ ارسال Request، 395؛ Swagger، 397؛ UserProfile، 400؛ هویت کاربر، 399.
K
- Keep It Simple, Stupid (KISS)، 79، 107.
L
- Language Integrated Query (LINQ)، 268، 273، 285.
M, N
- Metrics, Events, Logs, and Traces (MELT)، 346.
- Model-View-Controller (MVC)، 43، 49، 54، 120.
- Multipurpose Internet Mail Extensions (MIME)، 2، 5، 16، 31، 151–154، 163، 169، 170، 211، 295، 298.
O
- Object-Oriented Programming (OOP)، 81، 83.
- Object Relational Mapping (ORM)، 268، 271.
- Observability: Application، 346؛ Application Insights، 347؛ Behaviorها، 345؛ HealthCheck ـ Implementation/HTTP Endpoint 367، Liveness 370–372، Readiness 370–373، ReadyHealthCheck 371، Types 367؛ Logging ـ app.Logger 352، DefaultExceptionHandler 359، 360، DI 353، Error Log 362، Exception Search 361، ILogger 348، Levels 348، Log Details 356، 358، NuGet 349، Program.cs 351، Sensitive Information 347، Serilog 350، String Interpolation 357، Structured Logging 354، 355، Transaction Search 355؛ Logs/Events 346؛ Trace/Metrics 346؛ Tracing/Metrics ـ appsettings.json 363، Data Collection 363، Exceptionها 365، Metrics Overview 366، Program.cs 363، Telemetry 364، 365.
- OpenID Connect (OIDC)، 385: Authentication/Authorization، 389–395؛ Canva، 387؛ Identification، 386؛ Identity Provider، 387؛ Interaction، 386؛ JWT Standard، 387؛ Relationship، 386.
- Open Worldwide Application Security Project (OWASP)، 71: Application Design 88؛ Cryptographic Failures 88؛ Injection 87؛ Insecure Data Integrity 88؛ Logging/Monitoring 88؛ Obsolete Component 89؛ Protect Access 87؛ Security Configuration 89؛ SSRF 89؛ Weak Authentication/Authorization 86.
- Optimizations, APIs: Async Programming، 303؛ Caching، 326–342؛ HTTP Request، 342، 343؛ JSON Streaming، 324–326؛ Long-running Background Task، 310–321؛ Paging، 321–324.
- OWASP Secure Headers Project (OSHP)، 89.
P, Q
- Parameter Binding: AntiForgery، 112؛ Binding Attributeها، 110؛ Complex Typeها، 108، 109؛ Coordinates، 116؛ CountryIds، 220، 221؛ Data Elementها، 222–225؛ Data Manipulation، 219؛ Data Sourceها، 113؛ DisableAntiForgery، 113؛ Form Parameter، 112؛ Fundamentals، 107؛ GET Request، 115، 116؛ Headerها، 220–222؛ ids، 117؛ limitCountSearch، 116؛ Postman Request، 118، 221، 222؛ POST، 110، 111؛ PUT، 112، 115؛ QueryString، 116؛ Route Parameter، 109؛ Types، 220.
- Performance Testing، 404.
R
- Representational State Transfer (REST)، 1، 32: Architectural Style، 32؛ ASP.NET Core 8، 44، 53؛ Base URL، 34؛ Constraints، 33، 34؛ Data Access، 294–301؛ Documentation، 40؛ Media Type/Content-Type، 35، 36؛ Product Data Structure، 35؛ State Transfer، 33؛ URL Naming، 36–38؛ Versioning، 39، 40.
- Request for Comments (RFC)، 2؛ HTTPS، 30.
S
- Secure Socket Layer (SSL)، 30، 31.
- Separation of Concerns (SoC)، 80، 81، 129، 138، 214.
- Server-Side Request Forgery (SSRF)، 89.
- Single Sign-On (SSO)، 378، 386.
- Smoke Testing، 404.
- SMTP Configuration، 50.
- Streaming Content، 169–171.
- Structured Query Language (SQL): Data Access، 268، 269؛ EF Core، 271.
- System Under Test (SUT)، 405، 408، 410، 412، 415، 416، 418.
T
- Test-Driven Development (TDD)، 405.
- Testing: Types، 403؛ Unit Testing.
- Transport Layer Security (TLS)، 7؛ HTTPS، 29–31.
U, V
- Uniform Resource Characteristics (URC)، 27.
- Uniform Resource Identifier (URI)، 2، 54: Authority Structure، 24؛ Definition، 23–25؛ Host Information، 25؛ Structure، 24.
- Uniform Resource Locator (URL)، 25، 26: Naming، 36–38؛ REST، 34؛ Route Parameter، 38؛ Routing Method، 106.
- Uniform Resource Names (URN)، 27.
- Unit Testing، 403، 404: Characteristics، 405، 406؛ Project Structure، 407؛ SUT Step-by-step ـ Act 416، Assert 416–418، Constructor 415، CountryEndpoints 408، Creation 410–412، GetCountries 409، GetCountriesTests 410، Identification 409، pageIndex/pageSize 415، UnitTests Structure 412، Test Explorer 411، Writing Test 413–415؛ Tools/Libraries، 406، 407.
W, X, Y, Z
- Windows Communication Foundation (WCF)، 44.
- World Wide Web (WWW)، 1.
تصاویر منبع مرتبط با این بخش