test(random): 添加随机元素抽取函数的全面测试用例 Test #91
- 新增 Random.test.ts 文件,对 getRandomElements 函数进行详尽测试 - 包括基础功能、边界情况(count 为 0、负数、超出数组长度) - 支持空数组、单元素数组、字符串数组、对象数组等多种数据类型 - 增加概率性测试,验证多次调用结果不完全一致 - 20万次循环验证各元素被抽中概率接近理论值,确保算法公平性
This commit is contained in:
@@ -1,41 +0,0 @@
|
|||||||
import Button from '@/components/Button/index.vue'
|
|
||||||
|
|
||||||
import { shallowMount } from '@vue/test-utils'
|
|
||||||
import { describe, expect, test } from 'vitest'
|
|
||||||
// 测试分组
|
|
||||||
describe('Button', () => {
|
|
||||||
// mount
|
|
||||||
test('Buttons slot text', () => {
|
|
||||||
// @vue/test-utils
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
slots: {
|
|
||||||
default: 'Button',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
// 断言
|
|
||||||
expect(wrapper.text()).toBe('Button')
|
|
||||||
})
|
|
||||||
test('Button click', () => {
|
|
||||||
const wrapper = shallowMount(Button)
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeTruthy()
|
|
||||||
})
|
|
||||||
test('Button disabled', () => {
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
props: {
|
|
||||||
disabled: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeFalsy()
|
|
||||||
})
|
|
||||||
test('Button not disabled', () => {
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
props: {
|
|
||||||
disabled: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeTruthy()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
import Button from '@/components/Button/index.vue'
|
|
||||||
|
|
||||||
import { shallowMount } from '@vue/test-utils'
|
|
||||||
import { describe, expect, test } from 'vitest'
|
|
||||||
// 测试分组
|
|
||||||
describe('Button', () => {
|
|
||||||
// mount
|
|
||||||
test('Buttons slot text', () => {
|
|
||||||
// @vue/test-utils
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
slots: {
|
|
||||||
default: 'Button',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
// 断言
|
|
||||||
expect(wrapper.text()).toBe('Button')
|
|
||||||
})
|
|
||||||
test('Button click', () => {
|
|
||||||
const wrapper = shallowMount(Button)
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeTruthy()
|
|
||||||
})
|
|
||||||
test('Button disabled', () => {
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
props: {
|
|
||||||
disabled: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeFalsy()
|
|
||||||
})
|
|
||||||
test('Button not disabled', () => {
|
|
||||||
const wrapper = shallowMount(Button, {
|
|
||||||
props: {
|
|
||||||
disabled: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
wrapper.trigger('click')
|
|
||||||
expect(wrapper.emitted('click')).toBeTruthy()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
124
__test__/Random.test.ts
Normal file
124
__test__/Random.test.ts
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
import { describe, expect, it } from 'vitest'
|
||||||
|
import { getRandomElements } from '@/views/Home/utils/random'
|
||||||
|
|
||||||
|
describe('getRandomElements', () => {
|
||||||
|
// 测试基本功能:从数组中获取指定数量的元素
|
||||||
|
it('should return specified number of elements', () => {
|
||||||
|
const sourceArray = [1, 2, 3, 4, 5]
|
||||||
|
const result = getRandomElements(sourceArray, 3)
|
||||||
|
|
||||||
|
expect(result).toHaveLength(3)
|
||||||
|
result.forEach((element) => {
|
||||||
|
expect(sourceArray).toContain(element)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试边界情况:count为0
|
||||||
|
it('should return empty array when count is 0', () => {
|
||||||
|
const sourceArray = [1, 2, 3]
|
||||||
|
const result = getRandomElements(sourceArray, 0)
|
||||||
|
|
||||||
|
expect(result).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试边界情况:count为负数
|
||||||
|
it('should return empty array when count is negative', () => {
|
||||||
|
const sourceArray = [1, 2, 3]
|
||||||
|
const result = getRandomElements(sourceArray, -1)
|
||||||
|
|
||||||
|
expect(result).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试边界情况:count大于等于数组长度
|
||||||
|
it('should return shuffled array when count equals or exceeds array length', () => {
|
||||||
|
const sourceArray = [1, 2, 3]
|
||||||
|
const result1 = getRandomElements(sourceArray, 3)
|
||||||
|
const result2 = getRandomElements(sourceArray, 5)
|
||||||
|
|
||||||
|
expect(result1).toHaveLength(3)
|
||||||
|
expect(result2).toHaveLength(3)
|
||||||
|
|
||||||
|
// 验证返回的元素与原数组相同
|
||||||
|
expect(result1.sort()).toEqual(sourceArray.sort())
|
||||||
|
expect(result2.sort()).toEqual(sourceArray.sort())
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试空数组情况
|
||||||
|
it('should return empty array when source array is empty', () => {
|
||||||
|
const sourceArray: number[] = []
|
||||||
|
const result = getRandomElements(sourceArray, 3)
|
||||||
|
|
||||||
|
expect(result).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试单元素数组
|
||||||
|
it('should handle single element array', () => {
|
||||||
|
const sourceArray = [42]
|
||||||
|
const result = getRandomElements(sourceArray, 1)
|
||||||
|
|
||||||
|
expect(result).toEqual([42])
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试字符串数组
|
||||||
|
it('should work with string arrays', () => {
|
||||||
|
const sourceArray = ['a', 'b', 'c', 'd', 'e']
|
||||||
|
const result = getRandomElements(sourceArray, 2)
|
||||||
|
|
||||||
|
expect(result).toHaveLength(2)
|
||||||
|
result.forEach((element) => {
|
||||||
|
expect(sourceArray).toContain(element)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试对象数组
|
||||||
|
it('should work with object arrays', () => {
|
||||||
|
const sourceArray = [
|
||||||
|
{ id: 1, name: 'Alice' },
|
||||||
|
{ id: 2, name: 'Bob' },
|
||||||
|
{ id: 3, name: 'Charlie' },
|
||||||
|
]
|
||||||
|
const result = getRandomElements(sourceArray, 2)
|
||||||
|
|
||||||
|
expect(result).toHaveLength(2)
|
||||||
|
result.forEach((element) => {
|
||||||
|
expect(sourceArray).toContain(element)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试多次调用应产生不同结果(概率性测试)
|
||||||
|
it('should produce different results on multiple calls', () => {
|
||||||
|
const sourceArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
|
||||||
|
const results = new Set()
|
||||||
|
|
||||||
|
// 多次调用并收集结果
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
const result = getRandomElements(sourceArray, 5).sort().join(',')
|
||||||
|
results.add(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 虽然有极小概率会相同,但大多数情况下应该有不同的结果
|
||||||
|
expect(results.size).toBeGreaterThan(1)
|
||||||
|
})
|
||||||
|
// 多次调用,每个元素抽中的概率基本上相等
|
||||||
|
it('should have approximately equal probabilities for each element', () => {
|
||||||
|
const sourceArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
|
||||||
|
const times = 200000 // 次数
|
||||||
|
const count = 5 // 抽奖个数
|
||||||
|
const expectedProbability = count / sourceArray.length
|
||||||
|
const elementCounts = new Map()
|
||||||
|
|
||||||
|
// 多次调用并统计元素出现的次数
|
||||||
|
for (let i = 0; i < times; i++) {
|
||||||
|
const result = getRandomElements(sourceArray, count)
|
||||||
|
result.forEach((element) => {
|
||||||
|
const count = elementCounts.get(element) || 0
|
||||||
|
elementCounts.set(element, count + 1)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
elementCounts.forEach((value) => {
|
||||||
|
// 验证每个元素出现的概率接近相等
|
||||||
|
const probability = value / times
|
||||||
|
expect(probability).toBeCloseTo(expectedProbability, 2)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
// test axios request
|
|
||||||
import Request from '@/api/request';
|
|
||||||
import { describe, it, expect, vi } from 'vitest';
|
|
||||||
import { mount, flushPromises } from '@vue/test-utils';
|
|
||||||
import axios from 'axios';
|
|
||||||
|
|
||||||
const fn = vi.fn();
|
|
||||||
const mockRes = {
|
|
||||||
data: {
|
|
||||||
code: 200,
|
|
||||||
success: true,
|
|
||||||
message: 'success',
|
|
||||||
data: {
|
|
||||||
name: 'test',
|
|
||||||
age: 18,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
fn(mockRes);
|
|
||||||
fn.mock.calls[0] === [mockRes];
|
|
||||||
|
|
||||||
describe('Request', () => {
|
|
||||||
it('should return data when request success', async () => {
|
|
||||||
const request = new Request();
|
|
||||||
const res = await request({
|
|
||||||
url: '/test',
|
|
||||||
method: 'GET',
|
|
||||||
});
|
|
||||||
expect(res).toEqual(mockRes.data);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user