Token导航 LogoToken导航TokenDH.com
开发敏感数据github未标认证来源可访问clear审计通过

backend-testing后端测试

Agent Skill

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

总安装

288

周安装

12

GitHub Stars

2,472

下载量

96
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

3

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:backend-testing(后端测试)
来源仓库:https://github.com/exceptionless/exceptionless
仓库路径:skills/backend-testing
安装命令:
npx skills add https://github.com/exceptionless/exceptionless --skill backend-testing
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/exceptionless/exceptionless --skill backend-testing

简介

backend-testing 遵循 Microsoft 测试命名规范,提供可维护的测试用例设计标准。

  • 适用于方法级测试、状态验证和异常场景覆盖,提升测试可读性。
  • 通过 npx skills add 安装,需在编写测试时参考命名模式。
  • 测试文件需与生产代码同步更新,避免遗漏边界条件。
  • 建议使用 Arrange-Act-Assert 模式组织测试结构。

SKILL.md

Backend Testing

Test Naming Standards

Follow Microsoft's unit testing best practices:

Pattern: MethodUnderTest_Scenario_ExpectedBehavior

  • MethodUnderTest — The actual method on the class being tested, not necessarily the entry point you call. For example, when testing ObjectToInferredTypesConverter, use Read (the converter's method) even though you invoke it via _serializer.Deserialize().
  • Scenario — The input, state, or condition being tested.
  • ExpectedBehavior — What the method should do or return.
// ✅ Good: Clear method, scenario, and expected behavior
[Fact]
public void GetValue_JObjectWithUserInfo_ReturnsTypedUserInfo() { }

[Fact]
public void GetValue_MissingKey_ThrowsKeyNotFoundException() { }

[Fact]
public void Read_EmptyArray_ReturnsEmptyList() { }  // Tests ObjectToInferredTypesConverter.Read()

[Fact]
public void Write_NestedDictionary_SerializesCorrectly() { }  // Tests ObjectToInferredTypesConverter.Write()

[Fact]
public async Task PostEvent_WithValidPayload_ReturnsAccepted() { }

// ❌ Bad: Vague or missing context
[Fact]
public void TestGetValue() { }

[Fact]
public void CanGetValue() { }

[Fact]
public void Deserialize_EmptyArray_ReturnsEmptyList() { }  // Wrong: Deserialize is the entry point, not the method under test

Running Tests

# All tests
dotnet test

# By test name
dotnet test --filter "FullyQualifiedName~PostEvent_WithValidPayload_ReturnsAccepted"

# By class name
dotnet test --filter "ClassName~EventControllerTests"

Test Folder Structure

Tests mirror the source structure:

tests/Exceptionless.Tests/
├── AppWebHostFactory.cs         # WebApplicationFactory for integration tests
├── IntegrationTestsBase.cs      # Base class for integration tests
├── TestWithServices.cs          # Base class for unit tests with DI
├── Controllers/                 # API controller tests
├── Jobs/                        # Job tests
├── Repositories/                # Repository tests
├── Services/                    # Service tests
├── Utility/                     # Test data builders
│   ├── AppSendBuilder.cs        # Fluent HTTP request builder
│   ├── DataBuilder.cs           # Test data creation
│   ├── EventData.cs
│   ├── OrganizationData.cs
│   ├── ProjectData.cs
│   ├── ProxyTimeProvider.cs     # Time manipulation
│   └── ...
└── Validation/                  # Validator tests

Integration Test Base Pattern

Inherit from IntegrationTestsBase which uses Foundatio.Xunit's TestWithLoggingBase:

// From tests/Exceptionless.Tests/IntegrationTestsBase.cs
public abstract class IntegrationTestsBase : TestWithLoggingBase, IAsyncLifetime, IClassFixture<AppWebHostFactory>
{
    protected readonly TestServer _server;
    private readonly ProxyTimeProvider _timeProvider;

    public IntegrationTestsBase(ITestOutputHelper output, AppWebHostFactory factory) : base(output)
    {
        _server = factory.Server;
        _timeProvider = GetService<ProxyTimeProvider>();
    }

    protected TService GetService<TService>() where TService : notnull
        => ServiceProvider.GetRequiredService<TService>();

    protected FluentClient CreateFluentClient()
    {
        var settings = GetService<JsonSerializerOptions>();
        return new FluentClient(CreateHttpClient(), new JsonContentSerializer(settings));
    }
}

Real Test Example

From EventControllerTests.cs:

public class EventControllerTests : IntegrationTestsBase
{
    private readonly IEventRepository _eventRepository;
    private readonly IQueue<EventPost> _eventQueue;

    public EventControllerTests(ITestOutputHelper output, AppWebHostFactory factory) : base(output, factory)
    {
        _eventRepository = GetService<IEventRepository>();
        _eventQueue = GetService<IQueue<EventPost>>();
    }

    [Fact]
    public async Task PostEvent_WithValidPayload_EnqueuesAndProcessesEvent()
    {
        // Arrange
        /* language=json */
        const string json = """{"message":"test","reference_id":"TestReferenceId"}""";

        // Act
        await SendRequestAsync(r => r
            .Post()
            .AsTestOrganizationClientUser()
            .AppendPath("events")
            .Content(json, "application/json")
            .StatusCodeShouldBeAccepted()
        );

        var stats = await _eventQueue.GetQueueStatsAsync();
        Assert.Equal(1, stats.Enqueued);

        var processEventsJob = GetService<EventPostsJob>();
        await processEventsJob.RunAsync();
        await RefreshDataAsync();

        // Assert
        var events = await _eventRepository.GetAllAsync();
        var ev = events.Documents.Single(e => e.Type == Event.KnownTypes.Log);
        Assert.Equal("test", ev.Message);
    }
}

Test Structure (Arrange-Act-Assert)

Use clear // Arrange, // Act, // Assert comments for readability:

[Fact]
public void GetValue_DirectUserInfoType_ReturnsTypedValue()
{
    // Arrange
    var userInfo = new UserInfo("test@example.com", "Test User");
    var data = new DataDictionary { { "user", userInfo } };

    // Act
    var result = data.GetValue<UserInfo>("user", _jsonOptions);

    // Assert
    Assert.NotNull(result);
    Assert.Equal("test@example.com", result.Identity);
    Assert.Equal("Test User", result.Name);
}

JSON String Literals

Use /* language=json */ comment before JSON strings for IDE syntax highlighting and validation:

[Fact]
public void GetValue_JsonStringWithError_ReturnsTypedError()
{
    // Arrange
    /* language=json */
    const string json = """{"message":"Test error","type":"System.Exception"}""";
    var data = new DataDictionary { { "@error", json } };

    // Act
    var result = data.GetValue<Error>("@error", _jsonOptions);

    // Assert
    Assert.NotNull(result);
    Assert.Equal("Test error", result.Message);
}

FluentClient Pattern

Use SendRequestAsync with AppSendBuilder for HTTP testing:

await SendRequestAsync(r => r
    .Post()
    .AsTestOrganizationUser()          // Basic auth with test user
    .AppendPath("organizations")
    .Content(new NewOrganization { Name = "Test" })
    .StatusCodeShouldBeCreated()
);

// Available auth helpers
r.AsGlobalAdminUser()          // TEST_USER_EMAIL
r.AsTestOrganizationUser()     // TEST_ORG_USER_EMAIL
r.AsFreeOrganizationUser()     // FREE_USER_EMAIL
r.AsTestOrganizationClientUser() // API key bearer token

Test Data Builders

Create test data with CreateDataAsync:

var (stacks, events) = await CreateDataAsync(b => b
    .Event()
    .TestProject()
    .Type(Event.KnownTypes.Error)
    .Message("Test error"));

Assert.Single(stacks);
Assert.Single(events);

Time Manipulation with ProxyTimeProvider

NOT ISystemClock — use.NET 8+ TimeProvider with ProxyTimeProvider:

// Access via protected property
protected ProxyTimeProvider TimeProvider => _timeProvider;

// Advance time
TimeProvider.Advance(TimeSpan.FromHours(1));

// Set specific time
TimeProvider.SetUtcNow(new DateTimeOffset(2024, 1, 15, 12, 0, 0, TimeSpan.Zero));

// Restore to system time
TimeProvider.Restore();

Registered in test services:

services.ReplaceSingleton<TimeProvider>(_ => new ProxyTimeProvider());

Test Principles

  • TDD workflow — When fixing bugs or adding features, write a failing test first
  • Use real serializer — Tests use the same JSON serializer as production
  • Use real time provider — Manipulate via ProxyTimeProvider when needed
  • Refresh after writes — Call RefreshDataAsync() after database changes
  • Clean stateResetDataAsync() clears data between tests

Foundatio.Xunit

Base class provides logging integration:

using Foundatio.Xunit;

public class MyTests : TestWithLoggingBase
{
    public MyTests(ITestOutputHelper output) : base(output)
    {
        Log.DefaultLogLevel = LogLevel.Information;
    }
}

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Claude Code

29.96%
按下载量换算29

OpenCode

20.84%
按下载量换算20

Gemini CLI

16.38%
按下载量换算16

Antigravity

14.32%
按下载量换算14

trae

7.86%
按下载量换算8

Cursor

3.49%
按下载量换算3

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

来源信息

继续浏览同类 Skills