Skip to content

[BUG] 单元测试不稳定 #245

Description

@ukeSJTU

问题描述

目前单元测试存在不稳定情况,表现为随机生成的测试数据有可能重复,导致插入数据库的时候冲突

重现步骤

可以比较下面两次 CI/CD pipeline 运行情况,同样是 PR #244 触发的运行(该 PR 的修改没有涉及和单元测试等等相关的代码)

  1. 失败的运行:https://github.com/ukeSJTU/nomad/actions/runs/19915241104/attempts/1
  2. 重新运行后则通过:https://github.com/ukeSJTU/nomad/actions/runs/19915241104

预期行为

清楚简洁地描述你期望发生的事情。

实际行为

为了方便查看,我将报错信息拷贝如下:

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯

 FAIL   repository  src/domains/booking/payment.repository.test.ts > booking.payment.repository > returns payment page data with flights, passengers, and ancillary details
Error: Failed query: insert into "cities" ("id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at") values (default, $1, $2, $3, $4, $5, $6, $7, $8, $9, default, default) returning "id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at"
params: EOI,城市-EOI,Asia/Shanghai,true,E,,false,1,false
 ❯ NodePgPreparedQuery.queryWithCache node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/pg-core/session.ts:73:11
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:154:19
 ❯ createCity tests/integration/helpers/factories.ts:93:21
     91|     overrides.pinyinFirstLetter ?? (isDomestic ? iataCode[0] : null);
     92| 
     93|   const [created] = await db
       |                     ^
     94|     .insert(cities)
     95|     .values({
 ❯ createAirport tests/integration/helpers/factories.ts:136:35
 ❯ createFlight tests/integration/helpers/factories.ts:176:31
 ❯ createFlightWithSeatClass tests/integration/helpers/factories.ts:483:5
 ❯ createOrderScenario tests/integration/helpers/factories.ts:518:7
 ❯ src/domains/booking/payment.repository.test.ts:8:22

Caused by: error: duplicate key value violates unique constraint "cities_iata_code_unique"
 ❯ node_modules/.pnpm/pg-pool@3.10.1_pg@8.16.3/node_modules/pg-pool/index.js:45:11
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:161:13
 ❯ NodePgPreparedQuery.queryWithCache node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/pg-core/session.ts:71:12
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:154:19
 ❯ createCity tests/integration/helpers/factories.ts:93:21
 ❯ createAirport tests/integration/helpers/factories.ts:136:35
 ❯ createFlight tests/integration/helpers/factories.ts:176:31
 ❯ createFlightWithSeatClass tests/integration/helpers/factories.ts:483:5
 ❯ createOrderScenario tests/integration/helpers/factories.ts:518:7

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { length: 216, severity: 'ERROR', code: '23505', detail: 'Key (iata_code)=(EOI) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'cities', dataType: undefined, constraint: 'cities_iata_code_unique', file: 'nbtinsert.c', routine: '_bt_check_unique' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯


 Test Files  1 failed | 124 passed (125)
      Tests  1 failed | 1351 passed (1352)
   Start at  02:08:54
   Duration  90.18s (transform 8.62s, setup 45.27s, collect 92.13s, tests 161.35s, environment 62.44s, prepare 1613.11s)


Error: Error: Failed query: insert into "cities" ("id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at") values (default, $1, $2, $3, $4, $5, $6, $7, $8, $9, default, default) returning "id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at"
params: EOI,城市-EOI,Asia/Shanghai,true,E,,false,1,false
 ❯ NodePgPreparedQuery.queryWithCache node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/pg-core/session.ts:73:11
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:154:19
 ❯ createCity tests/integration/helpers/factories.ts:93:21
 ❯ createAirport tests/integration/helpers/factories.ts:136:35
 ❯ createFlight tests/integration/helpers/factories.ts:176:31
 ❯ createFlightWithSeatClass tests/integration/helpers/factories.ts:483:5
 ❯ createOrderScenario tests/integration/helpers/factories.ts:518:7
 ❯ src/domains/booking/payment.repository.test.ts:8:22

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { query: 'insert into "cities" ("id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at") values (default, $1, $2, $3, $4, $5, $6, $7, $8, $9, default, default) returning "id", "iata_code", "name", "timezone", "is_domestic", "pinyin_first_letter", "continent", "is_popular", "display_order", "is_deleted", "created_at", "updated_at"', params: [ 'EOI', '城市-EOI', 'Asia/Shanghai', true, 'E', null, false, 1, false ] }
Caused by: Caused by: error: duplicate key value violates unique constraint "cities_iata_code_unique"
 ❯ node_modules/.pnpm/pg-pool@3.10.1_pg@8.16.3/node_modules/pg-pool/index.js:45:11
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:161:13
 ❯ NodePgPreparedQuery.queryWithCache node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/pg-core/session.ts:71:12
 ❯ node_modules/.pnpm/drizzle-orm@0.44.7_@opentelemetry+api@1.9.0_@types+pg@8.15.5_kysely@0.28.8_pg@8.16.3/node_modules/src/node-postgres/session.ts:154:19
 ❯ createCity tests/integration/helpers/factories.ts:93:21
 ❯ createAirport tests/integration/helpers/factories.ts:136:35
 ❯ createFlight tests/integration/helpers/factories.ts:176:31
 ❯ createFlightWithSeatClass tests/integration/helpers/factories.ts:483:5
 ❯ createOrderScenario tests/integration/helpers/factories.ts:518:7

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { length: 216, severity: 'ERROR', code: '23505', detail: 'Key (iata_code)=(EOI) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'cities', dataType: undefined, constraint: 'cities_iata_code_unique', file: 'nbtinsert.c', routine: '_bt_check_unique' }

 ELIFECYCLE  Command failed with exit code 1.
Error: Process completed with exit code 1.

截图

如果适用,添加截图来帮助解释你的问题。

环境信息

  • 操作系统: [例如 macOS, Windows, Linux]
  • 浏览器: [例如 Chrome, Safari, Firefox]
  • 版本: [例如 22]
  • Node.js 版本: [例如 22.21.0]
  • pnpm 版本: [例如 10.17.1]

附加信息

在这里添加关于问题的任何其他背景信息。

相关问题

  • 链接到任何相关的问题

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions