# 测试 ASP.NET 核心应用程序的装入测试

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

您的应用程序在您的笔记本电脑 . 单元测试 pass@. 集成测试 PassQ. 中完美运作。 您调用您制作了 @,}, 然后突然将所有磨碎到一个停止的. •500个真正的用户同时进入您的主页\,\ 并且您的服务器开始返回 <503> 错误 MS K7 #你精心设计的缓冲策略\ mSSK8} 结果它像您想象的那样, “'” 相当有效 就像您认为“.” 这个数据库查询是快速的吗?

这是每个开发者都害怕的噩梦情景 ,,但大多数Don's '测试 **性能测试是't可选的MS K1 it' 成功发射和MSC3AM紧急页面=.之间的差别** 此两个“ - @ part ” 指南将展示您如何使用 k6,}这个现代载荷测试工具来防止这一场景的发生, 该工具对于企业应用程序来说足够强大但又简单到可以运行在您的 CIQ/\ CD Prouto@.}

这是 **部分#1** 以 k6: 来进行负载测试时的 2 -\ part 序列

- **本篇文章=)**@ :_ 介绍 k6,_ 安裝@ MS K2} 測試型態 @ MPK3} 以及為什麼 k6}
- **[《实际实施》](/blog/k6-testing-practical)**:写测试@,CI/CD整合 @,剖析_,和真实的#-世界示例

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

性能测试对于任何生产 ASP.NET Core application@.你是否正在建立一个简单的博客{,}(一个复杂的微服务架构_,)或企业应用程序{MS K5你需要知道 您的应用程序在 Matt.下是如何运行的吗?

此综合指南演示您如何使用 ASP\.}NET 核心应用程序装入测试 [k6](https://k6.io/) -}其中最强大的 Open@-}源载负载测试工具之一 [最小浏览量](/blog/minimalblog-introduction) 我们的示例应用程序 @ ( @ a a 简单标记@ MS K1}以博客为例,其中含有内存和输出 caching_ ),}% 这里显示的技术和模式应用到 **ASP.NET 核心应用程序**.

到了这两次-系列的结尾 你就知道该如何"MSC3"

- 在任何平台上安装和配置 k6@ 窗口 @ , MacMS K3Linux @ MPK4
- 编写不同情景的全面性业绩测试报告
- 与 GitHub Action 连接到您的 CI/}CD 管道
- 使用剖析工具@( @ dootTrace @ , @ dotMemory @)}与 k6一起寻找瓶颈
- 实施不同的测试策略 @:烟_,load@,压力_,加注,和浸泡检测
- 建立性能回归检测机制,防止低速代码进入生产

**为何以 MiminimalBlog 为例? @? @** '它是一個真正的 ASP.NET Core &9.0應用程式, 有共同的樣式Name:Razor Pages,記憶力在抓取 ,產品 MS K6檔案 IMS K7OMSKO8和標記處理}.你MSOK10將學會的測試方法 平等适用于您的 MVC aptsMS k11Web APIsMPK12Blazor 應用軟體MS13或最小的 APIS{.

[TOC]

## 什么是K6 和为什么使用它□?

[k6](https://k6.io/) 是一个为开发者构建的现代负荷测试工具@. @ 不同于旧的工具, 如JMeter 或 MalodRunner,_ k 6 is\ :}

- **开发者 @-# 友好**“:”测试用 JavaScript {(}ES6+)}写成。
- **CLI=-=第一位**“: 完美于CI/CD管道”
- **轻重量**: 單一二進位 *, 沒有依屬性
- **准确性**: 以 Go 寫入精确度量
- **脚本*** : 复杂情景的完整编程能力
- **云云 M- 已就绪**: 能夠與 k6 雲 MS K2 Grafana , 普羅米修斯

对于最小的Blog@ , @ k6 @ 是理想的, 因为 < :\ {}

1. **我们可以测试缓存**@:@ k6}可以校验缓存信头和行为
2. **我们可以模拟真实交通流量**: 测试多个同时使用的用户
3. **我们可以验证履约索赔**衡量实际反应时间
4. **我们可以与 CI/CD结合**“: ” 我们管道中的自动测试
5. **我们可以测试具体情景**@:_ 分类过滤@,_ 个人邮件 @MS K2_ 主页

## 正在安裝 k 6 @ {}

### Window 安装

**使用巧克力的选项 @(}推荐@)**

```powershell
choco install k6
```

**使用 winget 的选项@2:**

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

**手册安装**

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
```

**使用 MacPorts 的选项 @2:%**

```bash
sudo port install k6
```

**手册安装**

```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 安装

**使用软件包管理员**

用于 **乌本图(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
```

**使用 Snap 选项“ 2:”**

```bash
sudo snap install k6
```

**手册安装**

```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
```

**使用 docker 选项“ 4:”**

```bash
docker pull grafana/k6:latest

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

**檢查安裝@: @%**

```bash
k6 version
```

## 理解 k6测试解剖

在我们潜入测试前 , Let's understand k6" test

```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)}@**: 模拟同时用户
- **持续期限***:* 测试运行了多久
- **检查检查**@:_session 停止测试的语句
- **阈下限**: Pass/不合格标准
- **计量数**:反应时间,通过putMS K2错误率

## 性能测试类型

在测试您的应用程序前@, @ let @ ' @ 理解五个主要负荷测试类型, 以及何时使用每Q:}

```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-2VUs (虚拟用户’)
- 短时间 @(30 @s @sQ}-1_min)#
- 测试基本功能

### 2. 装入测试

**目的宗旨的目的**评估预期正常载荷下的性能

**何时使用**:

- 确定基准绩效
- 为核实苏丹解放军是否得到满足
- 定期业绩回归测试

**特征特点**:

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

### 3.压力测试

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

**何时使用**:

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

**特征特点**:

- 逐步增加的负载
- 超出正常能力
- 持续时间: : @ @ @ MS K1 @ 分钟

### 4.斯派克测试

**目的宗旨的目的**校对:Portnoy

**何时使用**:

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

**特征特点**:

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

### 5. 吸收测试 MS K1 延长试验 MSC2

**目的宗旨的目的**发现随时间推移的内存泄漏和退化

**何时使用**:

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

**特征特点**:

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

```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
```

## {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}为什么?

使用如此多的负载测试工具@ , @ 为何您要选择 k6? @ LetMS K2} 和流行的替代品比较 k6\ {:} ?

### k6vs Apache Jometer 诉阿帕奇

**阿帕奇·哈利梅特** 是载荷测试工具的老兵@(}自 @1999).

| 特写 @| @ k6} @ MS K3 @ Jometer @ | @
|---------|----|---------|
| **安装装置** |单二进制,没有依附关系MS K2需要 Java,更重的安裝}{|
| **试验定义** | JavaScript 代码 @| XML 或图形界面@|
| **资源使用量** 轻量级的(GO)}重力的|
| **CD 融合** | 精美的 @CLI-第一位 @MS K3 | 需要插件{|}
| **学习曲线** “|对开发商来说容易 ” @|Stepeper,GUIMS K3聚焦@|#
| **程序支持** |HTTP,WebSocketesMS K2GRPC|MSSK4FTPMPK5JDBC□,SMTP},等

**何时使用 Jimeter 代替@ : @**

- 用于非{-} 技术测试器的 GUI
- 超过 HTTP 的测试规程@( @JDBC,}LDAPMS K2_SOAP})}%
- 已经拥有Jimeter团队中的专门知识
- 需要广泛的插件生态系统

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

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

### k6 与 Locust 之比

**蝗灾** 是一个基于 Python 的负载测试工具@,}在 Pytheon 商店很受欢迎 @.}

@| @ 地貌 @ | @ k6 @ @ I| @ Locust @ MPK4 @
|---------|----|---------|
| **语言语文** |JavaScript|PythonMS K2
| **业绩表现 实绩** @|}非常快 (#Go runtime~)|#慢速{($Python GIL_)}@|#
| **使用范围** 简单 JavaScript @ | @ Pythonic@,# 简便 @ |}
| **分布式测试** @ | @ k6 @ 云端 @ I} 已付的 MS K3 @ * |# 内建了-@ in @ NSK6 @ free @ MPK7 @ * @ O|#
| **Web 界面** -=YTET -伊甸园字幕组=- 翻译:
| **计量导出** @| @ 多种格式 @ | @ CSV#, @ web UI #| @

**何时使用 Locust 代替@ : @**

- Python - 第一队
- 需要免费分发检测
- 测试时想要真实的网络界面@- @time Web UI
- 测试中复杂的 Python逻辑

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

- 提高准确衡量指标的绩效
- JavaScript 更熟悉网络开发者
- 更清洁的下限@ / @ assertion 语法
- 更好的普罗米修斯 /Grafana融合

### k6 诉 Gatling

**加注** 是一个基于 Scala-}工具,其报告功能极佳 @.

@| @ 地貌 @ | @ k6} @ I| @ 加特林 @ MPK4 @
|---------|----|---------|
| **语言语文** @ | @ JavaScript @ * Scala+/# #Java @| @
| **《报告》报告** @|_Basic {(+} 扩展)} |#美丽的建筑_-}#HTML reports@|}*
| **学习曲线** “| 简单”“| 中调” “MS K2”“Scala DSL ) MSC4 ”
| **业绩表现 实绩** {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}太棒了!
| **开放源码** @|_ 完全打开@|} 打开企业加+#-ons *%|}
| **云云服务处** -=YTET -伊甸园字幕组=- 翻译:

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

- JVM /+Scala团队专长
- 需要令人惊叹的建筑 -报告
- 测试复杂的HTTP假设情景
- 企业支助所需资源

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

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

### k6对火炮

**火炮** 是另一个 JavaScript 负载测试工具@. @%

@| @ 地物 @ | @ k6} @ I| @ 火炮 @ |#
|---------|----|---------|
| **试验定义** JavaScript代码 | -YAML JS勾起
| **业绩表现 实绩** @ |_ ahead@ MS K1_ Go_ } @ I|_ 慢速 @ MPK4 @ node. @jsQ @ |#
| **使用范围** |=代码-=基于|=YAML config}-=以|=
| **建于** | 负载测试 @| 加载 *+ 功能测试@|
| **发售** -=YTET 翻译:
| **扩展性** | 扩展@|插件 @|

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

- 优先选择YAML超过代码
- 需要 Socket@.o 测试
- 想要合并加载 *+}功能测试
- 已经使用节点@ . @js 生态系统

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

- 更精确的量度@(Go 相对于NOde.}js)
- 更好的门槛值制度
- 清洁的 JavaScript API
- 更加成熟和稳定

### {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}

**w平方公里** 是轻量级 HTTP 基准工具@.

@| @ 地貌 @ | @ k6 @ @ I| @ wrk @ MPK4 @
|---------|----|---------|
| **使用范围** -=YTET -伊甸园字幕组=- 翻译:
| **假设情景** | 丰富场景支持 @| 基本 HTTP 只@|
| **计量数** -=YTET -伊甸园字幕组=- 翻译:
| **脚本** ~ JavaScript ~ | Lua ~ 马斯克2 ~
| **使用大小写** @| 全面负载测试 |}快速基准 @MS K2#

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

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

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

- 更容易写作测试
- 改进报告和衡量标准
- 方案支持 @(ramp@-_up},}阶段=)
- CD 友好型

### k6 @ vs Playwright@ / @ Cypress @ MS K2_ browser @ MPK3}% based @ )

**lay人赖** 和 **闪压缩** 是浏览器自动化工具,有时用于装载测试@. @%

@ | @ 地物 @ I| @ k6 @ @ MPK3} 播放机@ MS K4 @ 网络记者 @ MISSK5 @
|---------|----|---------|
| **方 式方法** |协议-级 HTTP @|真正的浏览器 @MS K3
| **业绩表现 实绩** 上千个VUs *|* 10个浏览器*|*
| **资源使用量** *轻量级 轻度 *重度 * *browser *MS K3* *MSC4*
| **JavaScript 执行** # | @ 不,不,|# 是 @| @
| **首用个案** | 负载测试 @| E2E 功能测试@|

**何时使用 Playwright @ / @ 网络按键代替@ MS K1**

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

**为什么对大多数 ASP=.=NET Core appts@:}来说K6#是更好的?**

- 协议@- @ level 测试足够服务器@ - @ rendered apps
- 需要模拟同时用户@ 100+ @% 1}
- 提高资源使用效率

### 摘述: : @ k6'}甜点

**当您想要 :\ \ 时选择 k6\ {}**

- 快速,}准确的负载测试
- 开发者@- @% 友好 JavaScript API
- 优秀的CI/CD融合
- 协议 - 级别 HTTP 测试 @(no 浏览器需要@)
- 富有的情景支持 @( @smoke@,}load_,压力=,加注+,
- 利用良好生态系统的现代工具
- 轻量资源使用

**@ k6_ 完美地适合@ :}**

- AIP和网络服务
- Server - @%side 已提供应用程序
- CD 性能大门
- 开发者@- @% 驱动的性能测试
- Cloud M- 本地应用

**需要时,可考虑替代方案 @: @**

- 浏览器@ - @ 基于 broad 测试 #% MS K1_ use [lay人赖](https://playwright.dev/))
- HTTP @(use 以外的广泛的协议支持 [赫米特](https://jmeter.apache.org/))
- 免费分发测试@(_use [蝗灾](https://locust.io/))
- 美丽的建筑@- @in reports @(_use [加注](https://gatling.io/))
- 用于非{-} 技术测试器的 GUI @ (_ use [赫米特](https://jmeter.apache.org/))

## 下一步步骤

现在,你明白什么是 k\ 6 @\ MPK1 是如何安装它的 , _ 可用的性能测试类型@ MS K3\ 和为什么 k\ 6\ 是一个伟大的选择 对于 ASP\ I. NET Core application_ , 您已经准备好开始写实际的测试@.}

**继续 [《实际实施》](/blog/k6-testing-practical)** {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}在哪里?

- 设置测试环境
- 填充烟雾@,load @,压力 @ ,加注 @ I,和浸泡测试
- 测试缓存行为
- 现实的用户旅途模拟
- 与GitHub行动整合的CD
- 性效回归检测
- 用点跟踪和点记忆分析
- 最佳做法和排除故障

## 资源资源资源 资源和资源资源资源

### k6文档

- [官方的 k{6} docs](https://k6.io/docs/) “-”完整 k6}文档
- [k6 JavaScript API APIP( JPA )](https://k6.io/docs/javascript-api/) -所有可用的 k6APIs
- [k6 示例](https://github.com/grafana/k6-learn) - 示例测试脚本
- [k6 度量](https://k6.io/docs/using-k6/metrics/) 理解度量
- [k6 阈值](https://k6.io/docs/using-k6/thresholds/) @ -_ 设置通道@ MS K1_ fail description

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

- [阿帕奇·哈利梅特](https://jmeter.apache.org/) -Java-基于负载测试
- [蝗灾](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/) - 浏览器自动化 @&测试