|
5 | 5 | """
|
6 | 6 | 边缘检测 ,攻击性测试
|
7 | 7 | """
|
| 8 | + |
| 9 | + |
| 10 | +import pytest |
| 11 | +from core import TEMPLATE, URL, build_request_payload, send_request |
| 12 | + |
| 13 | + |
| 14 | +def test_missing_messages_field(): |
| 15 | + """缺失 messages 字段,服务应返回合理错误,而非崩溃""" |
| 16 | + data = { |
| 17 | + "stream": False, |
| 18 | + "max_tokens": 10, |
| 19 | + } |
| 20 | + payload = build_request_payload(TEMPLATE, data) |
| 21 | + resp = send_request(URL, payload).json() |
| 22 | + |
| 23 | + assert "detail" in resp, "返回中未包含 detail 错误信息字段" |
| 24 | + assert any("messages" in err.get("loc", []) for err in resp["detail"]), "未检测到 messages 字段缺失的报错" |
| 25 | + assert any("Field required" in err.get("msg", "") for err in resp["detail"]), "未检测到 'Field required' 错误提示" |
| 26 | + |
| 27 | + |
| 28 | +def test_malformed_messages_format(): |
| 29 | + """messages 为非列表,应报错而非崩溃""" |
| 30 | + data = { |
| 31 | + "stream": False, |
| 32 | + "messages": "我是一个非法的消息结构", |
| 33 | + "max_tokens": 10, |
| 34 | + } |
| 35 | + payload = build_request_payload(TEMPLATE, data) |
| 36 | + resp = send_request(URL, payload).json() |
| 37 | + assert "detail" in resp, "非法结构未被识别" |
| 38 | + assert any("messages" in err.get("loc", []) for err in resp["detail"]), "未检测到 messages 字段结构错误" |
| 39 | + assert any( |
| 40 | + "Input should be a valid list" in err.get("msg", "") for err in resp["detail"] |
| 41 | + ), "未检测到 'Input should be a valid list' 错误提示" |
| 42 | + |
| 43 | + |
| 44 | +def test_extremely_large_max_tokens(): |
| 45 | + """设置极大 max_tokens,观察模型内存/容错行为""" |
| 46 | + data = { |
| 47 | + "stream": False, |
| 48 | + "messages": [{"role": "user", "content": "1+1=?"}], |
| 49 | + "max_tokens": 10000000, |
| 50 | + } |
| 51 | + payload = build_request_payload(TEMPLATE, data) |
| 52 | + try: |
| 53 | + resp = send_request(URL, payload).json() |
| 54 | + assert "error" in resp or resp["usage"]["completion_tokens"] < 10000000 |
| 55 | + except Exception: |
| 56 | + pytest.fail("设置极大 max_tokens 时服务崩溃") |
| 57 | + |
| 58 | + |
| 59 | +def test_null_metadata(): |
| 60 | + """metadata = null""" |
| 61 | + data = { |
| 62 | + "stream": False, |
| 63 | + "messages": [{"role": "user", "content": "介绍下你自己"}], |
| 64 | + "max_tokens": 10, |
| 65 | + "metadata": None, |
| 66 | + } |
| 67 | + payload = build_request_payload(TEMPLATE, data) |
| 68 | + resp = send_request(URL, payload).json() |
| 69 | + assert "error" not in resp, "metadata=null 应被容忍而不是报错" |
| 70 | + |
| 71 | + |
| 72 | +def test_top_p_exceed_1(): |
| 73 | + """top_p 超过1,违反规定,服务应报错""" |
| 74 | + data = { |
| 75 | + "stream": False, |
| 76 | + "messages": [{"role": "user", "content": "非洲的首都是?"}], |
| 77 | + "top_p": 1.5, |
| 78 | + "max_tokens": 10, |
| 79 | + } |
| 80 | + payload = build_request_payload(TEMPLATE, data) |
| 81 | + resp = send_request(URL, payload).json() |
| 82 | + assert resp.get("object") == "error", "top_p > 1 应触发校验异常" |
| 83 | + assert "top_p value can only be defined" in resp.get("message", ""), "未返回预期的 top_p 错误信息" |
| 84 | + |
| 85 | + |
| 86 | +def test_mixed_valid_invalid_fields(): |
| 87 | + """混合合法字段与非法字段,看是否污染整个请求""" |
| 88 | + data = { |
| 89 | + "stream": False, |
| 90 | + "messages": [{"role": "user", "content": "你好"}], |
| 91 | + "max_tokens": 10, |
| 92 | + "invalid_field": "this_should_be_ignored_or_warned", |
| 93 | + } |
| 94 | + payload = build_request_payload(TEMPLATE, data) |
| 95 | + resp = send_request(URL, payload).json() |
| 96 | + assert "error" not in resp, "非法字段不应导致请求失败" |
| 97 | + |
0 commit comments