当前位置:首页>Excel>Playwright数据驱动测试:从Excel和JSON读取测试数据

Playwright数据驱动测试:从Excel和JSON读取测试数据

  • 2026-04-14 09:01:57
Playwright数据驱动测试:从Excel和JSON读取测试数据

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集

如果你还在为每个测试用例硬编码数据而头疼,或者每次数据变更都要翻遍几十个测试文件——是时候了解数据驱动测试了。今天,我们聊聊如何用 Playwright 优雅地从 Excel 和 JSON 文件中读取测试数据,让你的测试代码真正实现“一次编写,到处运行”。

为什么需要数据驱动测试?

先看个反例。假设我们要测试一个登录功能,传统写法可能是:

test('用户登录测试'async ({ page }) => {await page.fill('#username''zhangsan');await page.fill('#password''123456');await page.click('#login-btn');// 断言...});test('管理员登录测试'async ({ page }) => {await page.fill('#username''admin');await page.fill('#password''admin@123');await page.click('#login-btn');// 断言...});

发现问题了吗?每增加一个测试账户,就要复制粘贴一整段代码。当密码策略变化时,你得修改所有相关测试文件。这种维护成本,你懂的。

而数据驱动测试的思想很简单:分离测试逻辑与测试数据。我们的目标是把上面的代码改造成这样:

// 测试逻辑只有一份test('登录功能测试'async ({ page }) => {const testData = getTestData(); // 从外部文件读取for (const data of testData) {await performLogin(page, data);// 断言...  }});

接下来,我们看看具体怎么实现。

实战一:从 Excel 读取测试数据

Excel 可能是产品经理和业务人员最喜欢的数据格式。如果你的测试数据需要经常让非技术人员维护,Excel 是个不错的选择。

第一步:准备测试数据

创建一个 testdata.xlsx 文件,内容如下:

测试场景
username
password
expected_result
普通用户登录
zhangsan
123456
登录成功
管理员登录
admin
admin@123
跳转管理后台
密码错误
lisi
wrong_pwd
提示密码错误
用户不存在
notexists
123456
提示用户不存在

保存到项目目录的 data/ 文件夹下。

第二步:安装必要的包

Playwright 本身不处理 Excel,我们需要借助社区包:

npm install xlsx# 或者yarn add xlsx

第三步:实现 Excel 读取工具

创建 utils/excelReader.js

const XLSX = require('xlsx');const path = require('path');classExcelReader{/**   * 读取Excel文件   * @param {string}filePath - Excel文件路径   * @param {string}sheetName - 工作表名称(可选,默认为第一个)   * @returns {Array}测试数据数组   */static readTestData(filePath, sheetName = null) {try {// 解析文件路径const absolutePath = path.resolve(__dirname, '..', filePath);// 读取工作簿const workbook = XLSX.readFile(absolutePath);// 获取工作表const sheet = sheetName         ? workbook.Sheets[sheetName]        : workbook.Sheets[workbook.SheetNames[0]];if (!sheet) {thrownewError(`工作表 ${sheetName || '第一个'} 不存在`);      }// 转换为JSONconst jsonData = XLSX.utils.sheet_to_json(sheet);console.log(`成功从 ${filePath} 读取 ${jsonData.length} 条测试数据`);return jsonData;    } catch (error) {console.error('读取Excel文件失败:', error.message);throw error;    }  }/**   * 按测试场景筛选数据   * @param {string}filePath - Excel文件路径   * @param {string}scenario - 测试场景名称   */static getDataByScenario(filePath, scenario) {const allData = this.readTestData(filePath);return allData.filter(row => row['测试场景'] === scenario);  }}module.exports = ExcelReader;

第四步:在测试中使用

现在,让我们重写登录测试:

const { test, expect } = require('@playwright/test');const ExcelReader = require('../utils/excelReader');test.describe('登录功能数据驱动测试', () => {let testData;  test.beforeAll(() => {// 一次性读取所有测试数据    testData = ExcelReader.readTestData('./data/testdata.xlsx');console.log(`本次执行将运行 ${testData.length} 个测试用例`);  });  test('数据驱动登录测试'async ({ page }) => {// 遍历每条测试数据for (const data of testData) {// 使用测试场景作为子测试名称await test.step(`测试场景: ${data['测试场景']}`async () => {console.log(`执行用例: ${data['测试场景']}, 用户名: ${data.username}`);// 导航到登录页await page.goto('https://your-app.com/login');// 使用数据填充表单await page.fill('#username', data.username);await page.fill('#password', data.password);await page.click('#login-btn');// 根据预期结果进行断言if (data.expected_result === '登录成功') {await expect(page).toHaveURL('https://your-app.com/dashboard');await expect(page.locator('.welcome-message')).toContainText(data.username);        } elseif (data.expected_result.includes('提示')) {await expect(page.locator('.error-message')).toBeVisible();await expect(page.locator('.error-message')).toContainText(data.expected_result);        }// 如果是管理员登录的特殊断言if (data.username === 'admin' && data.expected_result === '跳转管理后台') {await expect(page).toHaveURL('https://your-app.com/admin');        }      });    }  });});

Excel 方案的优缺点

优点:

  • 非技术人员也能轻松维护
  • 支持复杂的数据格式(合并单元格、公式等)
  • 可以用 Excel 的数据验证功能保证数据质量

缺点:

  • 需要额外依赖
  • 版本控制时二进制文件对比困难
  • 读取速度相对较慢

Playwright mcp技术学习交流群

伙伴们,对AI测试、大模型评测、质量保障感兴趣吗?我们建了一个 「Playwright mcp技术学习交流群」,专门用来探讨相关技术、分享资料、互通有无。无论你是正在实践还是好奇探索,都欢迎扫码加入,一起抱团成长!期待与你交流!👇

实战二:从 JSON 读取测试数据

如果你团队里都是开发人员,或者你更喜欢纯文本的版本控制,JSON 可能是更好的选择。

第一步:创建 JSON 数据文件

创建 data/loginTestData.json

{"login_cases": [    {"test_scenario""普通用户登录","username""zhangsan","password""123456","expected_result""登录成功","permissions": ["view""edit"],"metadata": {"priority""P0","tags": ["smoke""regression"]      }    },    {"test_scenario""管理员登录","username""admin","password""admin@123","expected_result""跳转管理后台","permissions": ["view""edit""delete""admin"],"metadata": {"priority""P1","tags": ["regression"]      }    },    {"test_scenario""密码错误","username""lisi","password""wrong_pwd","expected_result""提示密码错误","metadata": {"priority""P2","tags": ["negative"]      }    }  ],"environment_config": {"base_url""https://your-app.com","timeout"30000  }}

第二步:创建 JSON 读取工具

创建 utils/jsonReader.js

const fs = require('fs').promises;const path = require('path');classJsonReader{/**   * 读取JSON测试数据   * @param {string}filePath - JSON文件路径   * @returns {Promise<Object>}解析后的JSON对象   */staticasync readTestData(filePath) {try {const absolutePath = path.resolve(__dirname, '..', filePath);const fileContent = await fs.readFile(absolutePath, 'utf-8');const jsonData = JSON.parse(fileContent);console.log(`从 ${filePath} 加载了 ${jsonData.login_cases?.length || 0} 个登录测试用例`);return jsonData;    } catch (error) {if (error.code === 'ENOENT') {console.error(`文件不存在: ${filePath}`);      } elseif (error instanceofSyntaxError) {console.error(`JSON格式错误: ${error.message}`);      }throw error;    }  }/**   * 根据标签过滤测试用例   * @param {string}filePath - JSON文件路径   * @param {string}tag - 标签名称   */staticasync getCasesByTag(filePath, tag) {const data = awaitthis.readTestData(filePath);if (!data.login_cases) return [];return data.login_cases.filter(testCase =>      testCase.metadata?.tags?.includes(tag)    );  }/**   * 获取环境配置   * @param {string}filePath - JSON文件路径   */staticasync getConfig(filePath) {const data = awaitthis.readTestData(filePath);return data.environment_config || {};  }}module.exports = JsonReader;

第三步:在测试中使用 JSON 数据

const { test, expect } = require('@playwright/test');const JsonReader = require('../utils/jsonReader');test.describe('JSON数据驱动登录测试', () => {let testCases;let config;  test.beforeAll(async () => {// 异步读取数据和配置const testData = await JsonReader.readTestData('./data/loginTestData.json');    testCases = testData.login_cases;    config = testData.environment_config;console.log(`基础URL: ${config.base_url}, 超时: ${config.timeout}ms`);  });// 只运行冒烟测试用例  test('冒烟测试:登录功能'async ({ page }) => {const smokeCases = await JsonReader.getCasesByTag('./data/loginTestData.json''smoke');for (const testCase of smokeCases) {await test.step(`冒烟测试 - ${testCase.test_scenario}`async () => {await page.goto(`${config.base_url}/login`);await page.fill('#username', testCase.username);await page.fill('#password', testCase.password);await page.click('#login-btn');// 使用环境配置中的超时时间await page.waitForTimeout(config.timeout);// 这里可以根据你的实际需求添加断言await expect(page).not.toHaveURL(`${config.base_url}/login`);      });    }  });// 运行所有测试用例,带详细断言  test('完整登录测试套件'async ({ page }) => {for (const testCase of testCases) {await test.step(testCase.test_scenario, async () => {// 这里可以添加更复杂的测试逻辑console.log(`测试用户权限: ${testCase.permissions?.join(', ') || '无'}`);// 实际测试步骤...await page.goto(`${config.base_url}/login`);// ... 更多测试代码      });    }  });});

更高级的用法:配合 Playwright Fixtures

如果你想让测试数据在整个项目范围内可用,可以创建自定义 fixture:

// fixtures/testDataFixture.jsconst { test: baseTest } = require('@playwright/test');const JsonReader = require('../utils/jsonReader');const test = baseTest.extend({testDataasync ({}, use) => {// 这里可以读取任何你需要的数据文件const data = await JsonReader.readTestData('./data/loginTestData.json');await use(data);  },smokeCasesasync ({}, use) => {const cases = await JsonReader.getCasesByTag('./data/loginTestData.json''smoke');await use(cases);  }});module.exports = { test };

然后在测试中直接使用:

const { test } = require('../fixtures/testDataFixture');test('使用fixture的测试'async ({ page, testData, smokeCases }) => {console.log(`总用例数: ${testData.login_cases.length}`);console.log(`冒烟用例数: ${smokeCases.length}`);// ... 测试逻辑});

JSON 方案的优缺点

优点:

  • 纯文本,版本控制友好
  • 无需额外依赖(Node.js 原生支持)
  • 结构灵活,支持嵌套数据
  • 读取速度快

缺点:

  • 非技术人员编辑困难
  • 没有 Excel 的数据验证功能
  • 容易因格式错误导致解析失败

如何选择?

根据我的经验,选择建议如下:

  1. 选 Excel 如果

    • 测试数据经常由产品/业务人员提供
    • 数据需要复杂的计算或格式
    • 已经有现成的 Excel 数据源
  2. 选 JSON 如果

    • 团队都是技术人员
    • 需要频繁进行版本控制和代码审查
    • 数据需要嵌套结构或复杂数据类型
  3. 混合使用(进阶方案):

    // 用Excel作为数据源,但转换为JSON格式存储const excelData = ExcelReader.readTestData('./data/raw/source.xlsx');const jsonData = JSON.stringify(excelData, null2);await fs.writeFile('./data/processed/testData.json', jsonData);// 然后在测试中使用JSON版本

避坑指南

  1. 路径问题:始终使用 path.resolve 处理文件路径,避免不同操作系统下的问题。

  2. 数据验证:在读取数据后,添加验证逻辑:

    functionvalidateTestData(data{const requiredFields = ['username''password''expected_result'];  data.forEach((row, index) => {    requiredFields.forEach(field => {if (!row[field]) {thrownewError(`第${index + 1}行缺少必要字段: ${field}`);      }    });  });}
  3. 性能优化:对于大量测试数据,考虑分批执行:

    // 分批执行,每批5个用例const batchSize = 5;for (let i = 0; i < testData.length; i += batchSize) {const batch = testData.slice(i, i + batchSize);// 执行批次...}
  4. 错误处理:添加详细的错误日志,方便调试:

    try {await performTest(data);catch (error) {console.error(`用例失败: ${data.test_scenario}`, {username: data.username,error: error.message  });// 可以继续执行下一个用例,而不是整个测试失败}

总结

数据驱动测试不是银弹,但它是提升测试代码可维护性的重要手段。通过将测试数据从代码中分离出来:

  1. 你的测试逻辑会更简洁,不再充斥着各种硬编码值
  2. 测试数据维护成本大大降低,非技术人员也能参与
  3. 更容易实现测试用例的复用和组合
  4. 测试报告更清晰,每个数据行都可以作为一个独立的测试步骤

无论是选择 Excel 还是 JSON,关键是开始实践。从最简单的登录测试开始,逐步将你的测试套件改造为数据驱动模式。你会发现,当产品经理直接给你一个 Excel 文件说“把这些测试用例都跑一下”时,你的内心会是多么的平静。

最后提醒一点:数据驱动测试虽然好,但不要过度设计。简单的、不会频繁变化的测试数据,直接写在代码里也许更合适。找到适合你项目的平衡点,这才是真正的工程智慧。

推荐学习

欢迎加入霍格沃兹测试开发学社 · 人工智能测试开发训练营(VIP)支持 线上线下

  • 扫码进群了解课程详情
  • 领取 VIP 专属优惠与学习资料

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-22 17:54:05 HTTP/2.0 GET : https://h.sjds.net/a/459943.html
  2. 运行时间 : 0.074914s [ 吞吐率:13.35req/s ] 内存消耗:4,395.48kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f579a01f349643453a6b190eb94fe008
  1. /yingpanguazai/ssd/ssd1/www/h.sjds.net/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/h.sjds.net/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/h.sjds.net/runtime/temp/ad153693ed39fba6d1bda2fe72512cde.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000506s ] mysql:host=127.0.0.1;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000602s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000263s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000245s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000460s ]
  6. SELECT * FROM `set` [ RunTime:0.000193s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000532s ]
  8. SELECT * FROM `article` WHERE `id` = 459943 LIMIT 1 [ RunTime:0.000447s ]
  9. UPDATE `article` SET `lasttime` = 1776851645 WHERE `id` = 459943 [ RunTime:0.000736s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000213s ]
  11. SELECT * FROM `article` WHERE `id` < 459943 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000431s ]
  12. SELECT * FROM `article` WHERE `id` > 459943 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000364s ]
  13. SELECT * FROM `article` WHERE `id` < 459943 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000668s ]
  14. SELECT * FROM `article` WHERE `id` < 459943 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000651s ]
  15. SELECT * FROM `article` WHERE `id` < 459943 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000891s ]
0.076514s