274 lines
6.1 KiB
JavaScript
274 lines
6.1 KiB
JavaScript
/**
|
||
* 预警检测逻辑测试
|
||
* @file test-alert-detection-logic.js
|
||
* @description 测试智能项圈预警的自动检测逻辑
|
||
*/
|
||
|
||
// 模拟前端判断函数
|
||
function determineAlertType(record) {
|
||
const alerts = []
|
||
|
||
// 检查电量预警
|
||
if (record.battery !== undefined && record.battery !== null && record.battery < 20) {
|
||
alerts.push('battery')
|
||
}
|
||
|
||
// 检查脱落预警 (bandge_status为0)
|
||
if (record.bandge_status !== undefined && record.bandge_status !== null && record.bandge_status === 0) {
|
||
alerts.push('wear')
|
||
}
|
||
|
||
// 检查离线预警 (is_connect为0)
|
||
if (record.is_connect !== undefined && record.is_connect !== null && record.is_connect === 0) {
|
||
alerts.push('offline')
|
||
}
|
||
|
||
// 检查温度预警
|
||
if (record.temperature !== undefined && record.temperature !== null) {
|
||
if (record.temperature < 20) {
|
||
alerts.push('temperature_low')
|
||
} else if (record.temperature > 40) {
|
||
alerts.push('temperature_high')
|
||
}
|
||
}
|
||
|
||
// 检查运动异常预警 (steps - y_steps为0)
|
||
if (record.steps !== undefined && record.y_steps !== undefined &&
|
||
record.steps !== null && record.y_steps !== null) {
|
||
const movementDiff = record.steps - record.y_steps
|
||
if (movementDiff === 0) {
|
||
alerts.push('movement')
|
||
}
|
||
}
|
||
|
||
// 返回第一个预警类型,如果没有预警则返回null
|
||
return alerts.length > 0 ? alerts[0] : null
|
||
}
|
||
|
||
// 获取预警类型文本
|
||
function getAlertTypeText(type) {
|
||
const typeMap = {
|
||
'battery': '低电量预警',
|
||
'offline': '离线预警',
|
||
'temperature_low': '温度过低预警',
|
||
'temperature_high': '温度过高预警',
|
||
'movement': '异常运动预警',
|
||
'wear': '佩戴异常预警'
|
||
}
|
||
return typeMap[type] || '未知预警'
|
||
}
|
||
|
||
// 测试数据
|
||
const testCases = [
|
||
{
|
||
name: '正常设备',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: null
|
||
},
|
||
{
|
||
name: '低电量预警',
|
||
data: {
|
||
battery: 15,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'battery'
|
||
},
|
||
{
|
||
name: '离线预警',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 25,
|
||
is_connect: 0,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'offline'
|
||
},
|
||
{
|
||
name: '佩戴异常预警',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 0,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'wear'
|
||
},
|
||
{
|
||
name: '温度过低预警',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 15,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'temperature_low'
|
||
},
|
||
{
|
||
name: '温度过高预警',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 45,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'temperature_high'
|
||
},
|
||
{
|
||
name: '异常运动预警',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 1000
|
||
},
|
||
expected: 'movement'
|
||
},
|
||
{
|
||
name: '多重预警(低电量+离线)',
|
||
data: {
|
||
battery: 15,
|
||
temperature: 25,
|
||
is_connect: 0,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'battery' // 应该返回第一个预警
|
||
},
|
||
{
|
||
name: '边界值测试 - 电量20',
|
||
data: {
|
||
battery: 20,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: null // 20不算低电量
|
||
},
|
||
{
|
||
name: '边界值测试 - 电量19',
|
||
data: {
|
||
battery: 19,
|
||
temperature: 25,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'battery' // 19算低电量
|
||
},
|
||
{
|
||
name: '边界值测试 - 温度20',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 20,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: null // 20不算温度过低
|
||
},
|
||
{
|
||
name: '边界值测试 - 温度19',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 19,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'temperature_low' // 19算温度过低
|
||
},
|
||
{
|
||
name: '边界值测试 - 温度40',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 40,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: null // 40不算温度过高
|
||
},
|
||
{
|
||
name: '边界值测试 - 温度41',
|
||
data: {
|
||
battery: 85,
|
||
temperature: 41,
|
||
is_connect: 1,
|
||
bandge_status: 1,
|
||
steps: 1000,
|
||
y_steps: 500
|
||
},
|
||
expected: 'temperature_high' // 41算温度过高
|
||
}
|
||
];
|
||
|
||
// 运行测试
|
||
function runTests() {
|
||
console.log('🧪 开始测试预警检测逻辑...\n');
|
||
|
||
let passed = 0;
|
||
let failed = 0;
|
||
|
||
testCases.forEach((testCase, index) => {
|
||
const result = determineAlertType(testCase.data);
|
||
const expected = testCase.expected;
|
||
const success = result === expected;
|
||
|
||
console.log(`测试 ${index + 1}: ${testCase.name}`);
|
||
console.log(` 输入数据:`, testCase.data);
|
||
console.log(` 预期结果: ${expected ? getAlertTypeText(expected) : '正常'}`);
|
||
console.log(` 实际结果: ${result ? getAlertTypeText(result) : '正常'}`);
|
||
console.log(` 测试结果: ${success ? '✅ 通过' : '❌ 失败'}`);
|
||
console.log('');
|
||
|
||
if (success) {
|
||
passed++;
|
||
} else {
|
||
failed++;
|
||
}
|
||
});
|
||
|
||
console.log('📊 测试总结:');
|
||
console.log(` 总测试数: ${testCases.length}`);
|
||
console.log(` 通过: ${passed}`);
|
||
console.log(` 失败: ${failed}`);
|
||
console.log(` 成功率: ${((passed / testCases.length) * 100).toFixed(1)}%`);
|
||
|
||
if (failed === 0) {
|
||
console.log('\n🎉 所有测试通过!预警检测逻辑工作正常。');
|
||
} else {
|
||
console.log('\n⚠️ 有测试失败,请检查预警检测逻辑。');
|
||
}
|
||
}
|
||
|
||
// 运行测试
|
||
runTests();
|