How‑to : Tests, sécurité, rollback et documentation
Nous finalisons l’ALM avec des tests couvrants, la sécurité appliquée partout, un plan de retour et une documentation durable.
Tests unitaires C# (xUnit) — exemple
Le test vérifie un calcul sans dépendances externes.
using Xunit;
public class MarginTests
{
[Theory]
[InlineData(1000, 800, 0.2)]
[InlineData(0, 0, 0)]
public void Computes_MarginRate(decimal revenue, decimal cost, decimal expected)
{
var margin = revenue - cost;
var rate = revenue == 0 ? 0 : margin / revenue;
Assert.Equal(expected, rate);
}
}
Test d’intégration API (PowerShell)
Un test simple valide la route et le schéma.
param([string]$EnvUrl, [string]$Token)
$body = @{ opportunityid = [guid]::Empty; applydiscount = $false } | ConvertTo-Json
$r = Invoke-RestMethod -Uri "$EnvUrl/api/data/v9.2/mar_custom_CalculateOpportunityMargin" -Method Post -Headers @{ Authorization = "Bearer $Token"; 'Content-Type' = 'application/json' } -Body $body
if ($null -eq $r.marginamount -or $null -eq $r.marginrate) { throw 'Contract mismatch' }
Sécurité : DLP, RBAC, secrets
Les contrôles s’appliquent tout au long du cycle.
- DLP : bloquer connecteurs non approuvés.
- RBAC Dataverse : rôle d’exécution pour l’API uniquement.
- Secrets : Key Vault et Variable Groups, aucune valeur en clair.
Rollback contrôlé
Nous définissons un retour rapide et documenté.
- Conserver N‑1 de la solution managed.
- Script de retour :
pac solution import --path artifacts/Marlk_SalesCore_N-1.zip --publish-changes true --force-overwrite true
- Si le schéma change, fournir scripts data fix.
Documentation : modèle README solution
Chaque solution embarque une documentation standardisée.
# Marlk_SalesCore
## Objectif
Expose des Custom APIs pour le domaine Sales.
## Contrats API
- mar_custom_CalculateOpportunityMargin(opportunityid: guid, applydiscount: bool) -> { marginamount: money, marginrate: decimal }
## Sécurité
- Rôle: Marlk.CustomApi.Executor
## Déploiement
- Pipelines: build.yml, release.yml
- Variables: pp-customapi-<env>
## Observabilité
- App Insights: resourceName, workspace