|
|
|
@ -0,0 +1,160 @@
|
|
|
|
|
describe('课前抽点功能测试', () => {
|
|
|
|
|
|
|
|
|
|
// 测试1:检查是否能正确抽取学生,且数量在30%-50%之间
|
|
|
|
|
test('应在30%-50%范围内抽取学生进行点名', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 10 },
|
|
|
|
|
{ name: '学生2', score: 5 },
|
|
|
|
|
{ name: '学生3', score: 8 },
|
|
|
|
|
{ name: '学生4', score: 3 },
|
|
|
|
|
{ name: '学生5', score: 12 },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudents = performMultipleWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查选中的学生数量是否在总人数的30%-50%之间
|
|
|
|
|
const totalStudents = students.length;
|
|
|
|
|
expect(selectedStudents.length).toBeGreaterThanOrEqual(Math.floor(0.3 * totalStudents));
|
|
|
|
|
expect(selectedStudents.length).toBeLessThanOrEqual(Math.floor(0.5 * totalStudents));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试2:确保不会重复选择同一个学生
|
|
|
|
|
test('学生不应被重复点名', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 10 },
|
|
|
|
|
{ name: '学生2', score: 5 },
|
|
|
|
|
{ name: '学生3', score: 8 },
|
|
|
|
|
{ name: '学生4', score: 3 },
|
|
|
|
|
{ name: '学生5', score: 12 },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudents = performMultipleWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查是否有重复的学生
|
|
|
|
|
const uniqueStudents = new Set(selectedStudents.map(student => student.name));
|
|
|
|
|
expect(uniqueStudents.size).toBe(selectedStudents.length); // 如果有重复,集合大小会小于数组长度
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试3:低分学生应有较高概率被抽中
|
|
|
|
|
test('低分学生应有更高概率被选中', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 5 }, // 低分
|
|
|
|
|
{ name: '学生2', score: 50 },
|
|
|
|
|
{ name: '学生3', score: 100 }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
let lowScoreSelected = 0;
|
|
|
|
|
const iterations = 1000;
|
|
|
|
|
|
|
|
|
|
// 进行多次测试,统计低分学生被选中的次数
|
|
|
|
|
for (let i = 0; i < iterations; i++) {
|
|
|
|
|
const selectedStudents = performMultipleWeightedRandom(students);
|
|
|
|
|
if (selectedStudents.some(student => student.name === '学生1')) {
|
|
|
|
|
lowScoreSelected++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查低分学生被选中的次数较高
|
|
|
|
|
expect(lowScoreSelected / iterations).toBeGreaterThan(0.4); // 期望低分学生被选中的概率较高
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试4:确保返回的学生总是有效的学生对象
|
|
|
|
|
test('随机选择应返回有效的学生对象', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 30 },
|
|
|
|
|
{ name: '学生2', score: 20 },
|
|
|
|
|
{ name: '学生3', score: 10 }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudents = performMultipleWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查返回的学生对象是否包含name和score
|
|
|
|
|
selectedStudents.forEach(student => {
|
|
|
|
|
expect(student).toHaveProperty('name');
|
|
|
|
|
expect(student).toHaveProperty('score');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 导入函数
|
|
|
|
|
const performWeightedRandom = require('./path-to-your-function');
|
|
|
|
|
|
|
|
|
|
describe('随机点名功能测试', () => {
|
|
|
|
|
|
|
|
|
|
// 测试1:所有学生积分都相等的情况
|
|
|
|
|
test('所有学生积分都相等时,应该随机选择任何一个学生', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 10 },
|
|
|
|
|
{ name: '学生2', score: 10 },
|
|
|
|
|
{ name: '学生3', score: 10 },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudent = performWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查返回值是否在给定的学生名单中
|
|
|
|
|
expect(students).toContainEqual(selectedStudent);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试2:学生的积分范围不同时,低分学生应有较高概率被选中
|
|
|
|
|
test('低分学生应该有较高的概率被选中', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 5 }, // 低分
|
|
|
|
|
{ name: '学生2', score: 50 },
|
|
|
|
|
{ name: '学生3', score: 100 }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
let lowScoreSelected = 0;
|
|
|
|
|
const iterations = 10000;
|
|
|
|
|
|
|
|
|
|
// 进行多次测试,统计被选中的学生
|
|
|
|
|
for (let i = 0; i < iterations; i++) {
|
|
|
|
|
const selectedStudent = performWeightedRandom(students);
|
|
|
|
|
if (selectedStudent.name === '学生1') {
|
|
|
|
|
lowScoreSelected++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查低分学生是否被选择较多次
|
|
|
|
|
expect(lowScoreSelected / iterations).toBeGreaterThan(0.4); // 期望低分学生被选中的概率较高
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试3:边界条件,单个学生的情况
|
|
|
|
|
test('只有一个学生时,应该总是选择该学生', () => {
|
|
|
|
|
const students = [{ name: '唯一学生', score: 10 }];
|
|
|
|
|
|
|
|
|
|
const selectedStudent = performWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查返回的学生是否就是唯一的学生
|
|
|
|
|
expect(selectedStudent.name).toBe('唯一学生');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试4:负分、零分和正分学生的情况
|
|
|
|
|
test('包含负分、零分和正分的学生,仍能正常选择学生', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: -10 },
|
|
|
|
|
{ name: '学生2', score: 0 },
|
|
|
|
|
{ name: '学生3', score: 10 }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudent = performWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查返回值是否在给定的学生名单中
|
|
|
|
|
expect(students).toContainEqual(selectedStudent);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 测试5:检查返回的学生不为空
|
|
|
|
|
test('随机选择应返回有效的学生', () => {
|
|
|
|
|
const students = [
|
|
|
|
|
{ name: '学生1', score: 30 },
|
|
|
|
|
{ name: '学生2', score: 20 },
|
|
|
|
|
{ name: '学生3', score: 10 }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const selectedStudent = performWeightedRandom(students);
|
|
|
|
|
|
|
|
|
|
// 检查返回的学生是否是定义好的对象之一
|
|
|
|
|
expect(selectedStudent).toHaveProperty('name');
|
|
|
|
|
expect(selectedStudent).toHaveProperty('score');
|
|
|
|
|
});
|
|
|
|
|
});
|