# 用 k6 测试 ASP. NET 核心应用程序加载: 导言

<!--category-- Testing, Performance, k6, ASP.NET -->
<datetime class="hidden">2025-12-02T14:00</datetime>

您的应用程序在您的笔记本电脑上完全有效。 单位测试通过。 集成测试通过。 您部署到制作中, 突然所有的东西都停止了。 500个真正的用户同时点击您的主页, 您的服务器开始返回503个错误。 您精心设计的缓存策略 ? 结果它不像您想象的那样有效 。 您认为数据库查询是快速的 。 它正在制造一个规模化的瓶颈 。

这是每个开发者恐惧的恶梦情景, 但大多数不进行测试。 **性能测试不是可选的, 而是成功发射和3点的紧急页面的区别。** 这个分为两部分的指南将展示您如何使用 k6 来预防这种情景, 这个现代载荷测试工具对企业应用程序来说足够强大, 但简单到可以运行在您的 CI/CD 管道中。

这是 **第一部分 第一部分** k6 载荷测试的两部分系列:

- **第1部分(本条)**k6入门,安装,测试类型,以及为什么K6入门
- **[第二部分:实际实施](/blog/k6-testing-practical)**写作测试、CI/CD集成、特征分析和现实世界实例

## 一. 导言 导言 导言 导言 导言 导言 一,导言 导言 导言 导言 导言 导言

性能测试对于任何生产 ASP. NET 核心应用程序都至关重要 。 您是否正在建立一个简单的博客、 一个复杂的微服务架构, 或者一个企业应用程序, 您需要知道您的应用程序在负荷中是如何运行的 。 它会处理100个同时使用的用户吗 ? 1000 ? 瓶颈在哪里? 您的缓存策略真的有效吗 ?

此全面指南演示您如何使用 ASP.NET 核心应用程序装入 ASP.NET 测试 [k6 k6](https://k6.io/) - 最强大的开放源码载荷测试工具之一 [最小浏览量](/blog/minimalblog-introduction) 我们的示例应用程序( 简单的标记- 以标记为基础的博客, 带有内存和输出缓存) , 这里显示的技术和模式应用到 **ASP.NET 任何核心应用程序**.

在这两部分系列的结尾, 你会知道如何:

- 在任何平台上安装和配置 k6 (窗口、 Mac、 Linux)
- 为不同设想情况编写综合性绩效测试报告
- 将 k6 和 GitHub Action 结合到您的 CI/CD 管道中
- 使用特征分析工具(多跟踪、 dotMemory)和 k6 来寻找瓶颈
- 实施不同的测试战略:烟雾、负载、压力、加压和浸泡测试
- 建立性能回归检测机制,防止低速代码进入生产阶段

**为何以最微小的Blog为例?** 这是一个真正的 ASP.NET Core 9.0 应用程序, 具有常见模式 : Razor Pages、 内存缓存、 输出缓存、 文件 I/ O 和标记处理 。 您将学习的测试方法同样适用于您的 MVC 应用程序、 Web API、 Blazor 应用程序或最小的 API 。

[TOC]

## K6是什么,为什么使用它?

[k6 k6](https://k6.io/) 是一个为开发者建造的现代负载测试工具。 不同于像 JMEMET 或 loadRunner 这样的老工具, k6 是 :

- **有利于开发者**:测试用 JavaScript (ES6+) 写入
- **CLI - 第一级**光/光/光/光管的完美
- **轻重量**:单一二进制,无依赖性
- **准确性**: 以 Go 写成,用于精确度量
- **脚本**:复杂情景的全面方案拟订能力
- **云云准备就绪**能够与 k6 云、 Grafana、 Prometheus 结合

对于最小Blog, k6 是理想的, 因为 :

1. **我们可以测试缓存**: k6 可以校验缓存信头和行为
2. **我们可以模拟真实交通流量**:测试多个同时用户
3. **我们可以验证履约索赔**衡量实际反应时间
4. **我们可以和CI/CD结合**:在管道中自动测试
5. **我们可以测试具体情景**类别过滤、个别职位、主页

## 正在安装 k6

### Window 安装

**备选办法1:使用巧克力(建议)**

```powershell
choco install k6
```

**备选案文2:使用翼**

```powershell
winget install k6 --source winget
```

**备选方案3:手工安装**

1. 下载最新的 Windows 释放 [GitHub 释放](https://github.com/grafana/k6/releases)
2. 解开 `k6.exe` 文件文件
3. 将目录添加到您的 PATH 或移动 `k6.exe` 已经在 PATH 中的目录

**核查安装 :**

```powershell
k6 version
```

### Mac 安装

**备选方案1:使用家居(推荐)**

```bash
brew install k6
```

**备选办法2:使用麦克插件**

```bash
sudo port install k6
```

**备选方案3:手工安装**

```bash
# Download and install the latest release
curl -O -L https://github.com/grafana/k6/releases/latest/download/k6-macos-amd64.zip
unzip k6-macos-amd64.zip
sudo cp k6-macos-amd64/k6 /usr/local/bin/
sudo chmod +x /usr/local/bin/k6
```

**核查安装 :**

```bash
k6 version
```

### Linux 安装

**备选办法1:使用一揽子管理人**

用于 **Debian/Ubuntu**:

```bash
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
```

用于 **联邦/CentOS/RHEL**:

```bash
sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6
```

**备选办法2:使用综合**

```bash
sudo snap install k6
```

**备选方案3:手工安装**

```bash
# Download the latest release
curl -O -L https://github.com/grafana/k6/releases/latest/download/k6-linux-amd64.tar.gz
tar -xzf k6-linux-amd64.tar.gz
sudo cp k6-linux-amd64/k6 /usr/local/bin/
sudo chmod +x /usr/local/bin/k6
```

**备选办法4:使用嵌入器**

```bash
docker pull grafana/k6:latest

# Run a test
docker run --rm -i grafana/k6:latest run - <script.js
```

**核查安装 :**

```bash
k6 version
```

## 理解 k6 测试解剖

在潜入测试前,让我们先了解K6测试的基本结构:

```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';

// Test configuration
export const options = {
  vus: 10,              // Virtual users
  duration: '30s',      // Test duration
};

// Setup function (runs once before test)
export function setup() {
  // Prepare test data
  return { baseUrl: 'http://localhost:5000' };
}

// Main test function (runs for each VU)
export default function(data) {
  const response = http.get(data.baseUrl);

  // Assertions
  check(response, {
    'status is 200': (r) => r.status === 200,
    'response time < 200ms': (r) => r.timings.duration < 200,
  });

  sleep(1); // Wait between iterations
}

// Teardown function (runs once after test)
export function teardown(data) {
  // Clean up
}
```

关键概念:

- **虚拟用户(VUs)**:模拟并行用户
- **持续期限**:测试运行时间有多长
- **检查检查**无法阻止测试的发声
- **阈下限**:通过/不通过标准
- **计量数**: 反应时间、输送量、误差率

## 性能测试类型

在测试您的应用程序之前,让我们先了解五个主要类型的载荷测试, 以及何时使用 :

```mermaid
graph TD
    A[Performance Testing Types] --> B[Smoke Test]
    A --> C[Load Test]
    A --> D[Stress Test]
    A --> E[Spike Test]
    A --> F[Soak Test]

    B --> B1[1-2 VUs<br/>30s-1min<br/>Basic Functionality]
    C --> C1[Normal Load<br/>5-15 minutes<br/>Verify SLAs]
    D --> D1[Gradual Increase<br/>10-30 minutes<br/>Find Breaking Point]
    E --> E1[Sudden Spike<br/>5-10 minutes<br/>Test Recovery]
    F --> F1[Normal Load<br/>Hours/Days<br/>Memory Leaks]

    style B stroke:#90EE90
    style C stroke:#87CEEB
    style D stroke:#FFD700
    style E stroke:#FF6347
    style F stroke:#DDA0DD
```

### 1. 烟雾测试

**目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的**: 校验系统在最低负荷下运行

**何时使用**:

- 每次改变代码后
- 在进行更密集的测试之前
- 在CI/CD中作为精神检查

**特征特征**:

- 1-2-2 VUs(虚拟用户)
- 短期(30s-1min)
- 测试基本功能

### 2. 装载试验

**目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的**:在预期正常负荷下评估业绩

**何时使用**:

- 确定基准绩效
- 满足苏丹解放军的要求,以核查苏丹解放军的遵守情况
- 定期业绩回归测试

**特征特征**:

- 实际用户数
- 持续负载
- 典型持续时间:5-15分钟

### 3. 压力测试

**目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的**:查找系统断点

**何时使用**:

- 理解能力限度
- 查明瓶颈
- 按比例规划

**特征特征**:

- 逐步增加的负载
- 超出正常能力
- 持续时间:10分钟至30分钟

### 4. 斯派试验

**目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的**:在突然的交通高峰下测试行为

**何时使用**:

- 准备产品发布
- 测试自动缩放
- 校验后退行为

**特征特征**:

- 装载量突然大幅增加
- 短短高峰期
- 总持续时间:5-10分钟

### 5. 软软试验(耐久试验)

**目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的 目的**:在一段时间内查找内存渗漏和退化

**何时使用**:

- 重大释放前
- 测试长期服务
- 审定资源清理

**特征特征**:

- 正常正常负载水平
- 延长期限(小时或日)
- 降解监测器

```mermaid
graph LR
    A[Start] --> B{Smoke Test Pass?}
    B -->|No| C[Fix Issues]
    C --> A
    B -->|Yes| D{Load Test Pass?}
    D -->|No| E[Optimize]
    E --> D
    D -->|Yes| F{Stress Test}
    F --> G{Found Limit?}
    G -->|Yes| H[Document Capacity]
    G -->|No| I[Increase Load]
    I --> F
    H --> J{Spike Test Pass?}
    J -->|No| K[Improve Resilience]
    K --> J
    J -->|Yes| L{Soak Test}
    L --> M{Memory Stable?}
    M -->|No| N[Fix Memory Leaks]
    N --> L
    M -->|Yes| O[Production Ready]

    style O stroke:#90EE90
```

## 为什么K6和不... ?

使用如此多的负载测试工具, 您为什么要选择 k6 ? 让我们比较 k6 与流行的替代工具 :

### k6 vs Apache JMEMETET 和 Apache 阿帕奇

**阿帕奇·哈利梅特** 是载荷测试工具的老兵(自1999年起)。

* 特写 * * k6 * Jameter * * Jameter * * 特写 * * k6 * Jameter * * * Jameter *
|---------|----|---------|
| **安装安装** 单二进制,无依附性 需要爪哇,更重安装
| **试验定义** JavaScript 代碼 * * XML 或 GUI * * * * * JavaScript 代碼 * * XML 或 GUI * * * JavaScript code * * XML 或 GUI *
| **资源使用量** *轻量级(GO) *重(Java) * *轻(GO) *重(Java) * *轻(GO) *重(Java) * *轻(GO) *重(Java) *
| **CI/CD 融合** 优秀 (CLI- First) {} {} 需要插件} {} {} {} {}
| **学习曲线** 开发商方便,Steeper,GUI焦点
| **程序支持** HTTP、WebSockets、GRPC 宽度(FTP、JDBC、SMTP等) 

**何时使用 JMEMET 代替 :**

- 对非技术测试者使用 GUI 的需要
- HTTP(JDBC、LDAP、SOAP)以外的测试协议
- 已经拥有Jimeter团队中的专门知识
- 需要广泛的插件生态系统

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- 快速写入测试( JavaScript vs XML)
- 较轻资源足足迹
- 更好地整合CI/CD
- 更现代的开发者经验

### k6 vs Locust , k6 vs Locust

**蝗灾** 是一种基于Python的负载测试工具,在Python商店很流行。

特写 @ k6 @ Locust @
|---------|----|---------|
| **语言语言语言** * JavaScript * Python * * JavaScript * Python * * JavaScript * Python * * JavaScript * Python * * JavaScript * Python * Python * * JavaScript * Python * * JavaScript * Python * Python * * JavaScript * Python * * JavaScript * 和 JavaScript * Python * Python * * 和 JavaScript * 贾斯克里普特 * 派松 * 皮顿* * 皮森 * 皮森 * 皮瑟松 *  *  *
| **业绩 业绩业绩 业绩业绩** 非常快( 运行时间)  慢( Python GIL)
| **使用范围** 简单 JavaScript 音波音,简单
| **分布式测试** k6云(已支付) 内建(免费)
| **Web 界面** 
| **计量导出** 许多格式 CSV,网络UI

**何时使用 Loust 代替 :**

- Python 第一小队
- 需要免费分发检测
- 测试时想要实时网络UIU
- 测试中复杂的 Python 逻辑

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- 提高准确衡量指标的绩效
- JavaScript 更熟悉网络开发者
- 更清洁的门槛/介入语法
- 更好地整合普罗米修斯/格拉法纳

### k6 vs 加特林

**加注** 是一个以Scala为基础的工具,其报告质量极佳。

特写 @ k6 @ Gatling @
|---------|----|---------|
| **语言语言语言** * JavaScript * Scala/Java * * JavaScript * Scala/Java * * JavaScript * * Scala/Java * * JavaScript * 贾瓦* * 斯卡拉/贾瓦 * JavaScala/Java * * JavaScala/Java * * JavaScript *
| **《报告报告》报告报告** * 基本 (+扩展) * 漂亮的内置 HTML 报告 *
| **学习曲线** 易 中 度 (Scala DSL)
| **业绩 业绩业绩 业绩业绩** 棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了,棒极了
| **开放源码** * 完全开放 * * 开放,加上企业附加项目 *
| **云云服务处** k6 云端加特林企业

**何时使用 Gatling 代替 :**

- JVM/Scala团队专门知识
- 需要惊人的内置报告
- 测试复杂的HTTP假设情景
- 企业支助所需资源

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- JavaScript 更方便使用
- 简易设置和执行
- 更好地进行快速的CI/CD检查
- 简单 HTTP 测试更简单

### k6 vs 火炮

**火炮** 是另一个 JavaScript 负载测试工具。

* 特写 * k6 * 火炮 * * * 特写 * * k6 * 火炮 * * * 特写 * * 特写 * * k6 * 火炮 * * * 特写 * * 特写 * * k6 * 火炮 *
|---------|----|---------|
| **试验定义** JavaScript代码 * YAML+JS钩子 * * JavaScript 代码 * YAML + JS钩子 *
| **业绩 业绩业绩 业绩业绩** 更快( Go) 慢( 节点)
| **使用范围** 以代码为主的  YAML 配置为主
| **建于** 方方方方方方方方方分方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方
| **发 发 发 价** * 极好的门槛 * * 基本期望 *
| **扩展性** 扩展  插件

**何时使用火炮代替:**

- 优先选择YAML超过代码
- e need need Socket.io 测试
- 想要合并负载+功能测试
- 已经使用 Node.js 生态系统

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- 更精确的衡量标准(Go对Node.js)
- 更好的门槛值制度
- 清洁的 JavaScript API
- 更加成熟和稳定

### k6 vs wrk/wrk2 (k6 vs wrk/wrk2)

**w平方公里** 是一个轻量级的 HTTP 基准工具。

* 特写 * * k6 * wrk * * 特写 * * 特写 * * k6 * * wrk *
|---------|----|---------|
| **使用范围** * 高级别API * 低级C+Lua *
| **假设情景** * 丰富的情景支持 * 基本 HTTP 仅 *
| **计量数** * 全面 基本 * * * 全面 * * 基本 * * * 全面 * * 全面 * 基本 * * * 全面 * * 全面 * 基本 * * * 全面 * * 基本 * * * 全面 * * 基本 * * 全面 * * 基本 * * 全面 * * 基本 * * 全面 * * 基本 * * 全面 * * 基本 * * 全面 * * * 全面 * * * 基本 * * * * 全面 * 全面 * * 基本 * * * * 全面 * * 全面 * * 基本 * * *
| **脚本脚本** * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * JavaScript * Lua * Java* * JavaScript * JavaScript * Lua * Lua * * Java* JavaScript * Java* Lua * Lua * * Java* Java* JavaScript * Java* Lua* Lua * Lua * Lua * Lua * Lua * Java * Java* * Java* *
| **使用大小写** 

**何时使用 wrk 代替 :**

- 需要绝对最低限度的间接费用
- 快速一次性基准
- 测试原HTTP性能
- 低级别协议测试

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- 更容易写作测试
- 改进报告和衡量标准
- 情景情景支持(设置、阶段)
- CI/CD 友好型

### k6 vs Playwrright/ Cypress (基于浏览器)

**lay人赖** 和 **结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结结** 是浏览器自动化工具,有时用于负载测试。

功能  k6
|---------|----|---------|
| **方 式 式 方法** 协议级别 HTTP 真实浏览器
| **业绩 业绩业绩 业绩业绩** 成千个VUs 成千上百个浏览器
| **资源使用量** *轻量级 *重(浏览器) * *轻* *重(浏览器) * *轻* *重 *重(浏览器) *
| **JavaScript 执行** 不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不
| **首用个案** 方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方

**何时使用 Playwright/ Cypress 代替 :**

- 需要测试 JavaScript 执行
- 必须验证浏览器配置
- 测试复合 SPA
- 功能E2E测试

**为什么 k6 对大多数 ASP. NET 核心应用程序来说更好:**

- 足以用于服务器发送应用程序的礼宾级别测试
- 需要模拟100+同步用户
- 提高资源使用效率

### 摘要: k6 的甜点

**想要时选择 k6 :**

- 快速、准确的负载测试
- 开发者友好型 JavaScript API
- 优秀的CI/CD一体化
- 协议级别 HTTP 测试(不需要浏览器)
- 丰富的情景支持(烟雾、负载、压力、压力、激增、泡泡)
- 利用良好生态系统的现代工具
- 轻量资源使用情况

**k6 完美于 :**

- AIP和网络服务
- 服务器端已提供应用程序
- CI/CD 业绩门户
- 由开发者驱动的绩效测试
- 云型应用

**如有需要,可考虑替代方案:**

- 基于浏览器的浏览器测试(使用) [lay人赖](https://playwright.dev/))
- HTTP(用途)以外的广泛的协议支持(用途) [赫米特](https://jmeter.apache.org/))
- 免费分发测试(使用) [蝗灾](https://locust.io/))
- 内置漂亮报告(使用) [加注](https://gatling.io/))
- 非技术测试者非技术测试器的图形界面(使用) [赫米特](https://jmeter.apache.org/))

## 下一步步骤

既然你明白K6是什么, 如何安装它, 可用性能测试的类型, 为什么K6是 ASP. NET Core 应用程序的绝佳选择, 你准备开始写实际测试。

**继续 [第二部分:实际实施](/blog/k6-testing-practical)** 在那里,我们将涵盖:

- 设置测试环境
- 写烟烟、负载、压力、冲刺和浸泡测试
- 测试缓存行为
- 现实的用户旅程模拟模拟
- CI/CD 与GitHub行动合并
- 性效回归检测
- 用点跟踪和点记忆分析
- 最佳做法和排除故障

## 资源资源资源 资源资源资源 资源资源 资源资源

### k6 文件文件

- [官方 k6 docs](https://k6.io/docs/) - 完成K6文件
- [k6 JavaScript API API 喷射器](https://k6.io/docs/javascript-api/) - 所有可用的 k6 API
- [k6 示例](https://github.com/grafana/k6-learn) - 试样脚本
- [k6 公吨](https://k6.io/docs/using-k6/metrics/) - 了解衡量标准
- [k6 阈值](https://k6.io/docs/using-k6/thresholds/) - 制定出入/失职标准

### 替代性负载测试工具

- [阿帕奇·哈利梅特](https://jmeter.apache.org/) - 基于爪哇的负载测试
- [蝗灾](https://locust.io/) - 基于Python的负载测试
- [加注](https://gatling.io/) - 基于Scala的负载测试
- [火炮](https://www.artillery.io/) - NOde.js负载测试
- [w平方公里](https://github.com/wg/wrk) - HTTP基准衡量工具
- [lay人赖](https://playwright.dev/) - 浏览器自动化和测试