Files
Masterarbeit/Versuche/Versuch 03/Ergenisse/software/SwRS_TestSpecification.md
2026-02-19 11:21:18 +01:00

24 KiB

Software Test Specification

Centron Enterprise Application - Testing Requirements and Strategy

Document Control

  • Project: Centron Enterprise Application
  • Version: 1.0
  • Date: 2025-09-30
  • Standard: ISO/IEC/IEEE 29148:2018
  • Classification: Software Test Requirements and Specifications

Table of Contents

  1. Test Strategy Overview
  2. Unit Testing Requirements
  3. Integration Testing Requirements
  4. System Testing Requirements
  5. Performance Testing Requirements
  6. Security Testing Requirements
  7. User Acceptance Testing
  8. Test Environment Requirements

1. Test Strategy Overview

1.1 Test Architecture

SW-TEST-001: The software SHALL implement comprehensive multi-level testing strategy

  • Test Pyramid Structure: Unit → Integration → System → End-to-End
  • Coverage Targets: Minimum 70% code coverage for business logic
  • Test Automation: 80%+ automated test execution
  • Continuous Integration: All tests must pass before deployment

Current Test Implementation Statistics:

  • Total Test Files: 336 test classes
  • Test Project Structure: 8 test projects across domains
  • Test Categories: Unit, Integration, End-to-End, API tests

1.2 Test Project Organization

tests/
├── apis/                           # External API Integration Tests
│   ├── Centron.APIs.CopDatabase.Tests/         # COP database API tests
│   ├── Centron.APIs.EgisDataAccess.Tests/      # EGIS system integration tests
│   ├── Centron.APIs.IcecatDataAccess.Tests/    # Icecat product API tests
│   └── Centron.APIs.ITscopeDataAccess.Tests/   # ITscope marketplace tests
├── backend/                        # Business Logic Tests
│   ├── Centron.Tests.BL/                       # Business logic unit tests
│   └── Centron.Tests.DAO/                      # Data access layer tests
├── shared/                         # Shared Test Utilities
│   └── Centron.Tests.Core/                     # Common test infrastructure
├── Centron.Tests.Integration/      # Integration testing suite
└── Centron.Tests.EndToEnd/         # End-to-end workflow tests

1.3 Testing Framework Stack

Framework Purpose Implementation Location
xUnit Unit testing framework All test projects
NHibernate Database testing with in-memory DB Backend tests
Moq Mocking framework Business logic tests
FluentAssertions Assertion library Throughout test suite
AutoFixture Test data generation Complex entity testing

2. Unit Testing Requirements

2.1 Business Logic Unit Tests

SW-UNIT-001: Business Logic Test Coverage

  • Location: tests/backend/Centron.Tests.BL/
  • Coverage Target: 85% minimum for all BL classes
  • Test Pattern: Arrange-Act-Assert (AAA)
  • Isolation: Complete isolation using mocks for dependencies

Example Test Implementation:

// File: tests/backend/Centron.Tests.BL/Sales/Receipts/ReceiptBLTests.cs
[TestClass]
public class ReceiptBLTests
{
    private Mock<ISession> _mockSession;
    private Mock<IAccountBL> _mockAccountBL;
    private ReceiptBL _receiptBL;

    [SetUp]
    public void Setup()
    {
        _mockSession = new Mock<ISession>();
        _mockAccountBL = new Mock<IAccountBL>();
        _receiptBL = new ReceiptBL(_mockSession.Object);
    }

    [Test]
    [TestCase("SW-UNIT-001.1")]
    public async Task CreateReceipt_WithValidData_ShouldReturnSuccess()
    {
        // Arrange
        var receiptData = new ReceiptCreateRequest
        {
            CustomerI3D = 123,
            Items = new[] { CreateValidReceiptItem() }
        };

        _mockAccountBL.Setup(x => x.GetAccount(123))
            .ReturnsAsync(Result.Success(CreateValidAccount()));

        // Act
        var result = await _receiptBL.CreateReceipt(receiptData);

        // Assert
        result.IsSuccess.Should().BeTrue();
        result.Value.Should().NotBeNull();
        result.Value.Number.Should().BeGreaterThan(0);
    }

    [Test]
    [TestCase("SW-UNIT-001.2")]
    public async Task CreateReceipt_WithInvalidCustomer_ShouldReturnError()
    {
        // Arrange
        var receiptData = new ReceiptCreateRequest
        {
            CustomerI3D = 999, // Non-existent customer
            Items = new[] { CreateValidReceiptItem() }
        };

        _mockAccountBL.Setup(x => x.GetAccount(999))
            .ReturnsAsync(Result.Error<Account>("Customer not found"));

        // Act
        var result = await _receiptBL.CreateReceipt(receiptData);

        // Assert
        result.IsSuccess.Should().BeFalse();
        result.ErrorMessage.Should().Contain("Customer not found");
    }
}

2.2 Algorithm Unit Tests

SW-UNIT-002: Calculation Algorithm Testing

  • Focus Areas: Price calculations, tax computations, discount algorithms
  • Precision Testing: Decimal precision and rounding validation
  • Edge Cases: Boundary conditions, null handling, overflow scenarios

Pricing Algorithm Test Example:

[TestClass]
public class ReceiptPriceCalculationTests
{
    [Test]
    [TestCase("SW-UNIT-002.1")]
    [TestCase(100.00, 0.19, 19.00, 119.00)] // Standard VAT
    [TestCase(50.50, 0.07, 3.54, 54.04)]   // Reduced VAT
    [TestCase(0.00, 0.19, 0.00, 0.00)]     // Zero amount
    public void CalculateVAT_WithValidInputs_ShouldReturnCorrectVAT(
        decimal netAmount, decimal vatRate, decimal expectedVat, decimal expectedGross)
    {
        // Arrange
        var calculator = new VATCalculator();

        // Act
        var result = calculator.CalculateVAT(netAmount, vatRate);

        // Assert
        result.VATAmount.Should().Be(expectedVat);
        result.GrossAmount.Should().Be(expectedGross);
    }

    [Test]
    [TestCase("SW-UNIT-002.2")]
    public void CalculateSwissRounding_ShouldRoundTo5Rappen()
    {
        // Arrange
        var amounts = new[] { 1.01m, 1.02m, 1.03m, 1.06m, 1.07m, 1.08m };
        var expected = new[] { 1.00m, 1.00m, 1.05m, 1.05m, 1.05m, 1.10m };

        // Act & Assert
        for (int i = 0; i < amounts.Length; i++)
        {
            var result = SwissRounding.RoundTo5Rappen(amounts[i]);
            result.Should().Be(expected[i], $"Amount {amounts[i]} should round to {expected[i]}");
        }
    }
}

2.3 Entity Validation Tests

SW-UNIT-003: Data Validation Testing

  • Validation Rules: Test all entity validation logic
  • Constraint Testing: Database constraint simulation
  • Business Rules: Domain-specific validation requirements

3. Integration Testing Requirements

3.1 Database Integration Tests

SW-INT-001: Data Access Integration Testing

  • Location: tests/backend/Centron.Tests.DAO/
  • Database: In-memory SQLite for fast execution
  • Schema: Full schema creation and validation
  • Data Integrity: Foreign key and constraint testing

DAO Integration Test Pattern:

[TestClass]
public class AccountDAOIntegrationTests : DatabaseTestBase
{
    private ISession _session;
    private AccountDAO _accountDAO;

    [SetUp]
    public void Setup()
    {
        _session = SessionFactory.OpenSession();
        _accountDAO = new AccountDAO(_session);
        SetupTestData();
    }

    [Test]
    [TestCase("SW-INT-001.1")]
    public async Task SaveAccount_WithCompleteData_ShouldPersistCorrectly()
    {
        // Arrange
        var account = new Account
        {
            Number = 12345,
            Name = "Test Account",
            Email = "test@example.com",
            IsActive = true
        };

        // Act
        using var transaction = _session.BeginTransaction();
        await _accountDAO.SaveAsync(account);
        await transaction.CommitAsync();

        // Assert
        var savedAccount = await _accountDAO.GetByIdAsync(account.I3D);
        savedAccount.Should().NotBeNull();
        savedAccount.Name.Should().Be("Test Account");
        savedAccount.Number.Should().Be(12345);
    }

    [Test]
    [TestCase("SW-INT-001.2")]
    public async Task QueryAccounts_WithComplexFilter_ShouldReturnCorrectResults()
    {
        // Arrange
        await SetupMultipleTestAccounts();

        var filter = new AccountSearchFilter
        {
            SearchText = "Test",
            IsActive = true,
            CreatedFrom = DateTime.Today.AddDays(-30)
        };

        // Act
        var results = await _accountDAO.SearchAsync(filter);

        // Assert
        results.Should().NotBeEmpty();
        results.All(a => a.IsActive).Should().BeTrue();
        results.All(a => a.Name.Contains("Test")).Should().BeTrue();
    }
}

3.2 Web Service Integration Tests

SW-INT-002: API Integration Testing

  • Location: tests/Centron.Tests.Integration/
  • Test Server: In-memory test server for API testing
  • Authentication: Test authentication and authorization flows
  • Data Flow: End-to-end DTO conversion testing

API Integration Test Example:

[TestClass]
public class AccountWebServiceIntegrationTests : WebServiceTestBase
{
    [Test]
    [TestCase("SW-INT-002.1")]
    public async Task CreateAccount_ThroughAPI_ShouldReturnValidDTO()
    {
        // Arrange
        var createRequest = new CreateAccountRequest
        {
            Name = "API Test Account",
            Email = "api@test.com",
            AccountTypes = new[] { AccountType.Customer }
        };

        // Act
        var response = await ApiClient.PostAsync("/api/accounts", createRequest);

        // Assert
        response.Should().BeSuccessful();
        var accountDTO = await response.ReadAsAsync<AccountDTO>();
        accountDTO.Should().NotBeNull();
        accountDTO.Name.Should().Be("API Test Account");
        accountDTO.I3D.Should().BeGreaterThan(0);
    }

    [Test]
    [TestCase("SW-INT-002.2")]
    public async Task GetAccount_WithInvalidId_ShouldReturn404()
    {
        // Act
        var response = await ApiClient.GetAsync("/api/accounts/99999");

        // Assert
        response.StatusCode.Should().Be(HttpStatusCode.NotFound);
    }
}

3.3 External API Integration Tests

SW-INT-003: Third-Party API Testing

  • Mock Services: Mock external APIs for consistent testing
  • Error Handling: Test failure scenarios and retry logic
  • Data Synchronization: Verify data mapping and transformation

4. System Testing Requirements

4.1 End-to-End Workflow Tests

SW-SYS-001: Complete Business Process Testing

  • Location: tests/Centron.Tests.EndToEnd/
  • Scope: Full business workflows from start to finish
  • User Scenarios: Real-world usage patterns
  • Data Persistence: Verify complete data lifecycle

End-to-End Test Example:

[TestClass]
public class ReceiptProcessingWorkflowTests : EndToEndTestBase
{
    [Test]
    [TestCase("SW-SYS-001.1")]
    public async Task CompleteReceiptWorkflow_FromOfferToInvoice_ShouldSucceed()
    {
        // Arrange - Create test customer and articles
        var customer = await CreateTestCustomer();
        var articles = await CreateTestArticles();

        // Act 1 - Create Offer
        var offer = await CreateOffer(customer, articles);
        offer.Should().NotBeNull();
        offer.State.Should().Be(ReceiptState.Draft);

        // Act 2 - Convert to Order
        var order = await ConvertOfferToOrder(offer);
        order.Should().NotBeNull();
        order.State.Should().Be(ReceiptState.Approved);

        // Act 3 - Process Delivery
        var deliveryList = await CreateDeliveryList(order);
        await ProcessDelivery(deliveryList);

        // Act 4 - Generate Invoice
        var invoice = await GenerateInvoice(order);
        invoice.Should().NotBeNull();
        invoice.TotalAmount.Should().Be(order.TotalAmount);

        // Assert - Verify complete workflow
        var updatedOrder = await GetOrder(order.I3D);
        updatedOrder.State.Should().Be(ReceiptState.Invoiced);

        var generatedInvoice = await GetInvoice(invoice.I3D);
        generatedInvoice.State.Should().Be(ReceiptState.Completed);
    }

    [Test]
    [TestCase("SW-SYS-001.2")]
    public async Task AssetServiceWorkflow_FromInstallationToMaintenance_ShouldTrackCorrectly()
    {
        // Arrange
        var customer = await CreateTestCustomer();
        var hardware = await CreateTestHardwareArticle();

        // Act - Install Asset
        var asset = await InstallCustomerAsset(customer, hardware);
        asset.Should().NotBeNull();

        // Act - Create Service Contract
        var contract = await CreateServiceContract(asset);
        contract.Should().NotBeNull();

        // Act - Schedule Maintenance
        var serviceOrder = await ScheduleMaintenance(asset);
        serviceOrder.Should().NotBeNull();

        // Act - Complete Service
        await CompleteServiceOrder(serviceOrder);

        // Assert
        var updatedAsset = await GetAsset(asset.I3D);
        updatedAsset.LastMaintenanceDate.Should().BeCloseTo(DateTime.Now, TimeSpan.FromMinutes(5));
        updatedAsset.ServiceHistory.Should().Contain(h => h.ServiceOrderI3D == serviceOrder.I3D);
    }
}

4.2 User Interface System Tests

SW-SYS-002: WPF Application Testing

  • UI Automation: Automated UI testing with Windows Application Driver
  • User Workflows: Complete user interaction scenarios
  • Data Binding: Verify MVVM pattern implementation

5. Performance Testing Requirements

5.1 Load Testing Requirements

SW-PERF-001: System Performance Validation

  • Database Operations: Query performance under load
  • API Endpoints: Response time requirements
  • Memory Usage: Memory leak detection and monitoring
  • Concurrent Users: Multi-user scenario testing

Performance Test Specifications:

[TestClass]
public class PerformanceTests : PerformanceTestBase
{
    [Test]
    [TestCase("SW-PERF-001.1")]
    public async Task AccountSearch_Under100ConcurrentUsers_ShouldMaintainResponseTime()
    {
        // Arrange
        var concurrentUsers = 100;
        var searchTasks = new List<Task<TimeSpan>>();

        // Act
        for (int i = 0; i < concurrentUsers; i++)
        {
            searchTasks.Add(MeasureAccountSearchTime());
        }

        var responseTimes = await Task.WhenAll(searchTasks);

        // Assert
        var averageTime = responseTimes.Average(t => t.TotalMilliseconds);
        var maxTime = responseTimes.Max(t => t.TotalMilliseconds);

        averageTime.Should().BeLessThan(2000, "Average response time should be under 2 seconds");
        maxTime.Should().BeLessThan(5000, "Maximum response time should be under 5 seconds");

        var slowQueries = responseTimes.Count(t => t.TotalMilliseconds > 3000);
        slowQueries.Should().BeLessThan(5, "Less than 5% of queries should exceed 3 seconds");
    }

    [Test]
    [TestCase("SW-PERF-001.2")]
    public async Task ReceiptCalculation_WithLargeItemCount_ShouldCompleteInReasonableTime()
    {
        // Arrange
        var receipt = await CreateReceiptWithItems(1000); // 1000 items

        // Act
        var stopwatch = Stopwatch.StartNew();
        var result = await CalculateReceiptPrices(receipt);
        stopwatch.Stop();

        // Assert
        result.Should().NotBeNull();
        stopwatch.ElapsedMilliseconds.Should().BeLessThan(5000,
            "Large receipt calculation should complete within 5 seconds");
    }
}

5.2 Memory and Resource Testing

SW-PERF-002: Resource Utilization Testing

  • Memory Leaks: NHibernate session management validation
  • Database Connections: Connection pool management testing
  • Garbage Collection: .NET garbage collection impact analysis

6. Security Testing Requirements

6.1 Authentication and Authorization Tests

SW-SEC-001: Security Validation Testing

  • Authentication: User login and session management
  • Authorization: Role-based access control validation
  • Input Validation: SQL injection and XSS prevention
  • Data Protection: Sensitive data encryption verification

Security Test Examples:

[TestClass]
public class SecurityTests : SecurityTestBase
{
    [Test]
    [TestCase("SW-SEC-001.1")]
    public async Task AccessRestrictedResource_WithoutPermission_ShouldReturnForbidden()
    {
        // Arrange
        var limitedUser = await CreateUserWithLimitedRights();
        var token = await AuthenticateUser(limitedUser);

        // Act
        var response = await ApiClient.GetAsync("/api/admin/sensitive-data",
            headers: new { Authorization = $"Bearer {token}" });

        // Assert
        response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
    }

    [Test]
    [TestCase("SW-SEC-001.2")]
    public async Task SqlInjectionAttempt_ShouldBeSanitized()
    {
        // Arrange
        var maliciousInput = "'; DROP TABLE Accounts; --";

        // Act
        var searchResult = await AccountSearch.SearchByName(maliciousInput);

        // Assert
        searchResult.Should().BeEmpty();
        // Verify Accounts table still exists
        var accountCount = await CountAccountsInDatabase();
        accountCount.Should().BeGreaterThan(0);
    }

    [Test]
    [TestCase("SW-SEC-001.3")]
    public void PasswordHashing_ShouldUseSecureAlgorithm()
    {
        // Arrange
        var password = "TestPassword123!";
        var hasher = new PasswordHasher();

        // Act
        var hash = hasher.HashPassword(password);

        // Assert
        hash.Should().NotBe(password);
        hash.Length.Should().BeGreaterThan(50);
        hasher.VerifyPassword(password, hash).Should().BeTrue();
    }
}

6.2 Data Privacy Testing

SW-SEC-002: GDPR Compliance Testing

  • Data Anonymization: Personal data removal verification
  • Access Logging: Audit trail completeness
  • Data Export: Personal data export functionality
  • Right to Deletion: Complete data removal validation

7. User Acceptance Testing

7.1 Business Process Validation

SW-UAT-001: User Acceptance Test Scenarios

  • Real User Workflows: Actual business process execution
  • User Interface Usability: UI/UX validation
  • Performance Acceptance: End-user performance requirements
  • Business Rule Validation: Domain expert verification

UAT Test Scenarios:

Scenario ID Description Acceptance Criteria
UAT-001 Customer Account Creation Account created with all required fields, automatically assigned number
UAT-002 Receipt Processing Workflow Offer → Order → Invoice progression with proper state tracking
UAT-003 Asset Installation and Service Hardware asset installed, service contract created, maintenance scheduled
UAT-004 Financial Reporting Accurate financial reports with correct calculations and tax handling
UAT-005 User Rights Management Role-based access properly restricts functionality

7.2 Regression Testing

SW-UAT-002: Regression Test Suite

  • Automated Regression: Daily automated test execution
  • Manual Regression: Weekly manual test execution for critical paths
  • Performance Regression: Continuous performance monitoring
  • Browser Compatibility: Multi-browser web component testing

8. Test Environment Requirements

8.1 Test Infrastructure

SW-ENV-001: Test Environment Specifications

  • Development Testing: Local developer machines with in-memory databases
  • Integration Testing: Shared test environment with test database
  • Performance Testing: Production-like environment with load generators
  • User Acceptance Testing: Staging environment with production data copy

Environment Configuration:

# Test Environment Configuration
environments:
  development:
    database: "InMemory SQLite"
    external_apis: "Mocked"
    performance_monitoring: false

  integration:
    database: "SQL Server Test Instance"
    external_apis: "Test Stubs"
    performance_monitoring: true

  staging:
    database: "SQL Server Staging"
    external_apis: "Sandbox APIs"
    performance_monitoring: true
    security_scanning: true

  performance:
    database: "SQL Server Performance"
    load_generators: true
    monitoring_tools: true
    resource_profiling: true

8.2 Test Data Management

SW-ENV-002: Test Data Strategy

  • Data Generation: Automated test data creation using AutoFixture
  • Data Seeding: Consistent seed data for integration tests
  • Data Privacy: No production data in test environments
  • Data Cleanup: Automatic cleanup after test execution

Test Data Factory Example:

public class TestDataFactory
{
    private readonly Fixture _fixture;

    public TestDataFactory()
    {
        _fixture = new Fixture();
        ConfigureFixture();
    }

    public Account CreateValidAccount(string name = null)
    {
        return _fixture.Build<Account>()
            .With(a => a.Name, name ?? _fixture.Create<string>())
            .With(a => a.Number, () => GenerateUniqueAccountNumber())
            .With(a => a.IsActive, true)
            .Without(a => a.I3D) // Let database generate
            .Create();
    }

    public Receipt CreateValidReceipt(int customerI3D)
    {
        return _fixture.Build<Receipt>()
            .With(r => r.CustomerI3D, customerI3D)
            .With(r => r.State, ReceiptState.Draft)
            .With(r => r.CreatedAt, DateTime.Now)
            .Without(r => r.I3D)
            .Create();
    }
}

8.3 Continuous Integration Testing

SW-ENV-003: CI/CD Test Integration

  • Build Pipeline: All tests execute on every commit
  • Test Reporting: Comprehensive test result reporting
  • Coverage Analysis: Code coverage tracking and reporting
  • Quality Gates: Minimum test coverage and pass rate requirements

CI Pipeline Test Stages:

  1. Unit Tests: Fast feedback (< 5 minutes)
  2. Integration Tests: Database and API validation (< 15 minutes)
  3. System Tests: End-to-end scenarios (< 30 minutes)
  4. Performance Tests: Load and stress testing (< 60 minutes)

Test Execution Requirements

Testing Standards and Practices

Test Naming Convention:

  • Format: MethodUnderTest_Scenario_ExpectedBehavior
  • Examples:
    • CreateAccount_WithValidData_ShouldReturnSuccess
    • CalculateVAT_WithZeroAmount_ShouldReturnZeroVAT

Test Categories:

  • [TestCategory("Unit")] - Fast, isolated unit tests
  • [TestCategory("Integration")] - Database and API integration tests
  • [TestCategory("System")] - End-to-end workflow tests
  • [TestCategory("Performance")] - Load and performance tests
  • [TestCategory("Security")] - Security validation tests

Coverage Requirements:

  • Business Logic: Minimum 85% line coverage
  • Data Access: Minimum 75% line coverage
  • Web Services: Minimum 80% line coverage
  • Critical Paths: 100% coverage for payment and security functions

Test Reporting and Metrics

Quality Metrics:

  • Test Pass Rate: Minimum 95% for deployment
  • Test Execution Time: Maximum 2 hours for full suite
  • Defect Density: Less than 1 defect per 100 lines of code
  • Test Coverage: Overall minimum 70% code coverage

Document Approval

  • Test Manager: Test strategy and coverage requirements approved
  • Quality Assurance Lead: Test specifications and acceptance criteria validated
  • Development Team Lead: Test implementation feasibility confirmed
  • Security Officer: Security testing requirements verified
  • Date: 2025-09-30
  • Version Control: Committed to repository requirements/software/