Files
vibe_data_ana/tests/__pycache__/test_config.cpython-311-pytest-8.3.3.pyc

388 lines
84 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><><EFBFBD>i:<00><00><><00>dZddlZddlmcmZddlZddlZddl Z ddl
m Z ddl m Z ddlmZmZmZmZmZmZmZmZGd<06>d<07><00>ZGd<08>d <09><00>ZGd
<EFBFBD>d <0B><00>ZGd <0C>d <0A><00>ZGd<0E>d<0F><00>ZdS)u$配置管理模块的单元测试。<E8AF95>N)<01>Path)<01>patch)<08> LLMConfig<69>PerformanceConfig<69> OutputConfig<69>Config<69>
get_config<EFBFBD>
set_config<EFBFBD>load_config_from_env<6E>load_config_from_filec<00>6<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z dS) <09> TestLLMConfigu测试 LLM 配置。c<00>2 <00>td<01><02><00>}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j
}d}||k}|s<>tjd|fd ||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j }d }||k}|s<>tjd|fd ||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j }d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j }d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}|j}d
}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>d
x}x}}d
S)<18>测试默认配置。<E7BDAE>test_key<65><01>api_key<65>openai<61><01>==<3D>z0%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py5)s<>config<69><03>py0<79>py2<79>py5<79>assert %(py7)s<>py7N<37>z/%(py2)s
{%(py2)s = %(py0)s.api_key
} == %(py5)szhttps://api.openai.com/v1<76>z0%(py2)s
{%(py2)s = %(py0)s.base_url
} == %(py5)s<>gpt-4<>z-%(py2)s
{%(py2)s = %(py0)s.model
} == %(py5)s<>x<00>z/%(py2)s
{%(py2)s = %(py0)s.timeout
} == %(py5)s<><00>z3%(py2)s
{%(py2)s = %(py0)s.max_retries
} == %(py5)sgffffff<66>?<3F>z3%(py2)s
{%(py2)s = %(py0)s.temperature
} == %(py5)s<><01>is)z2%(py2)s
{%(py2)s = %(py0)s.max_tokens
} is %(py5)s<>r<00>provider<65>
@pytest_ar<61>_call_reprcompare<72> @py_builtins<6E>locals<6C>_should_repr_global_name<6D> _saferepr<70>AssertionError<6F>_format_explanationr<00>base_url<72>model<65>timeout<75> max_retries<65> temperature<72>
max_tokens<EFBFBD><07>selfr<00> @py_assert1<74> @py_assert4<74> @py_assert3<74> @py_format6<74> @py_format8s <20>8D:\code\iov_data_analysis_agent_old\tests\test_config.py<70>test_default_configz!TestLLMConfig.test_default_configsP<00><00><1A>:<3A>.<2E>.<2E>.<2E><06>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>c
<00>D <00>tdddddddd<08> <09><00>}|j}d}||k}|s<>tjd
|fd ||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j
}d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd
|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0A>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}dS)<18>测试自定义配置。<E7BDAE>gemini<6E>
gemini_key<EFBFBD>https://gemini.api<70>
gemini-pro<72><<00><00><00>?i<><00>r+rr4r5r6r7r8r9rrrrrrNrr r"r$r&r')z2%(py2)s
{%(py2)s = %(py0)s.max_tokens
} == %(py5)sr*r:s rA<00>test_custom_configz TestLLMConfig.test_custom_config%sn<00><00><1A><1D> <20>)<29><1E><16><19><1B><1B> 
<EFBFBD> 
<EFBFBD> 
<EFBFBD><06> +<2B>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(rCc<00><><00>tjtd<01><02><00>5td<03><04><00>ddd<05><00>dS#1swxYwYdS)u测试空 API key。uAPI key 不能为空<E4B8BA><01>match<63>rN<><04>pytest<73>raises<65>
ValueErrorr<00>r;s rA<00>test_empty_api_keyz TestLLMConfig.test_empty_api_key;s<><00><00> <13>]<5D>:<3A>-C<> D<> D<> D<> "<22> "<22> <15>b<EFBFBD> !<21> !<21> !<21> !<21> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "<22><><EFBFBD><EFBFBD> "<22> "<22> "<22> "<22> "<22> "<22> <00>:<03>><07>>c<00><><00>tjtd<01><02><00>5tdd<04><05><00>ddd<06><00>dS#1swxYwYdS)u测试无效的 provider。u不支持的 LLM providerrP<00>test<73>invalid)rr+NrSrWs rA<00>test_invalid_providerz#TestLLMConfig.test_invalid_provider@s<><00><00> <13>]<5D>:<3A>-H<> I<> I<> I<> :<3A> :<3A> <15>f<EFBFBD>y<EFBFBD> 9<> 9<> 9<> 9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> <00>;<03>?<07>?c<00><><00>tjtd<01><02><00>5tdd<04><05><00>ddd<06><00>dS#1swxYwYdS)u测试无效的 timeout。utimeout 必须大于 0rPr[r)rr6NrSrWs rA<00>test_invalid_timeoutz"TestLLMConfig.test_invalid_timeoutEs<><00><00> <13>]<5D>:<3A>-E<> F<> F<> F<> 1<> 1<> <15>f<EFBFBD>a<EFBFBD> 0<> 0<> 0<> 0<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<><31><EFBFBD><EFBFBD> 1<> 1<> 1<> 1<> 1<> 1r^c<00><><00>tjtd<01><02><00>5tdd<04><05><00>ddd<06><00>dS#1swxYwYdS)u测试无效的 max_retries。umax_retries 不能为负数rPr[<00><><EFBFBD><EFBFBD><EFBFBD>)rr7NrSrWs rA<00>test_invalid_max_retriesz&TestLLMConfig.test_invalid_max_retriesJs<><00><00> <13>]<5D>:<3A>-J<> K<> K<> K<> 6<> 6<> <15>f<EFBFBD>"<22> 5<> 5<> 5<> 5<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<><36><EFBFBD><EFBFBD> 6<> 6<> 6<> 6<> 6<> 6r^N)
<EFBFBD>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rBrNrXr]r`rc<00>rCrArrst<00><00><00><00><00><00><1E><1E> )<29> )<29> )<29>)<29>)<29>)<29>,"<22>"<22>"<22>
:<3A>:<3A>:<3A>
1<>1<>1<>
6<>6<>6<>6<>6rCrc<00>*<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>ZdS)<07>TestPerformanceConfigu测试性能配置。c<00><>
<00>t<00><00>}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j
}d }||k}|s<>tjd|fd
||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d }||k}|s<>tjd|fd ||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d }||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}dS)r<00>r<00>z8%(py2)s
{%(py2)s = %(py0)s.agent_max_rounds
} == %(py5)srrrrNi,<00>z5%(py2)s
{%(py2)s = %(py0)s.agent_timeout
} == %(py5)si'<00>z;%(py2)s
{%(py2)s = %(py0)s.tool_max_query_rows
} == %(py5)srJ<00>z>%(py2)s
{%(py2)s = %(py0)s.tool_execution_timeout
} == %(py5)si@B<00>z5%(py2)s
{%(py2)s = %(py0)s.data_max_rows
} == %(py5)s<>z=%(py2)s
{%(py2)s = %(py0)s.data_sample_threshold
} == %(py5)s<><00>z<%(py2)s
{%(py2)s = %(py0)s.max_concurrent_tasks
} == %(py5)s<>r<00>agent_max_roundsr,r-r.r/r0r1r2r3<00> agent_timeout<75>tool_max_query_rows<77>tool_execution_timeout<75> data_max_rows<77>data_sample_threshold<6C>max_concurrent_tasksr:s rArBz)TestPerformanceConfig.test_default_configSsd<00><00>"<22>$<24>$<24><06>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/rCc <00><>
<00>tddddddd<06><07><00>}|j}d}||k}|s<>tjd|fd ||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j
}d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd|fd||f<02><00>d
t j<00><00>vstj|<01><00>rtj|<01><00>nd
tj|<02><00>tj|<03><00>d <0B>z}d d |iz}ttj |<06><00><00><00><00>dx}x}}dS)rE<00>
iX<00><><00>i <20><00>)rvrwrxryrzr{r|rrmrrrrNrnrorprqrrrtrur:s rArNz(TestPerformanceConfig.test_custom_config_s<><00><00>"<22><1F><1D> $<24>#%<25> <20>"(<28>!"<22>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> -<2D>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/rCc<00><><00>tjtd<01><02><00>5td<03><04><00>ddd<05><00>dS#1swxYwYdS)u#测试无效的 agent_max_rounds。uagent_max_rounds 必须大于 0rPr<00>rvN<>rTrUrVrrWs rA<00>test_invalid_agent_max_roundsz3TestPerformanceConfig.test_invalid_agent_max_roundsss<><00><00> <13>]<5D>:<3A>-N<> O<> O<> O<> 2<> 2<> <1D>q<EFBFBD> 1<> 1<> 1<> 1<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<><32><EFBFBD><EFBFBD> 2<> 2<> 2<> 2<> 2<> 2rYc<00><><00>tjtd<01><02><00>5td<03><04><00>ddd<05><00>dS#1swxYwYdS)u&测试无效的 tool_max_query_rows。u"tool_max_query_rows 必须大于 0rPrb)rxNr<4E>rWs rA<00> test_invalid_tool_max_query_rowsz6TestPerformanceConfig.test_invalid_tool_max_query_rowsxs<><00><00> <13>]<5D>:<3A>-Q<> R<> R<> R<> 6<> 6<> <1D>"<22> 5<> 5<> 5<> 5<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<><36><EFBFBD><EFBFBD> 6<> 6<> 6<> 6<> 6<> 6rYN)rdrerfrgrBrNr<>r<>rhrCrArjrjPsV<00><00><00><00><00><00><1F><1F>
0<>
0<>
0<>0<>0<>0<>(2<>2<>2<>
6<>6<>6<>6<>6rCrjc<00>*<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>ZdS)<07>TestOutputConfigu测试输出配置。c <00><> <00>t<00><00>}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j
}d}||k}|s<>tjd|fd ||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}t|<07><00>}d
} || z }
t|
<EFBFBD><00>} || k}|<04>sstjd|fd || f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>d t j<00><00>vstjt<00><00>rtjt<00><00>nd d t j<00><00>vstjt<00><00>rtjt<00><00>nd tj|<07><00>tj|<08><00>tj| <09><00>tj| <0B><00>d<0E>z} dd| iz} ttj | <0A><00><00><00><00>dx}x}x}x}x} x}
} |j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj |<06><00><00><00><00>dx}x}}dS)r<00>outputr<00>z2%(py2)s
{%(py2)s = %(py0)s.output_dir
} == %(py5)srrrrN<>z/%(py2)s
{%(py2)s = %(py0)s.log_dir
} == %(py5)s<>charts)z|%(py2)s
{%(py2)s = %(py0)s.chart_dir
} == %(py14)s
{%(py14)s = %(py4)s((%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
} / %(py11)s))
}<7D>strr)rr<00>py4rr<00>py9<79>py11<31>py14zassert %(py16)s<>py16zanalysis_report.md<6D>z7%(py2)s
{%(py2)s = %(py0)s.report_filename
} == %(py5)s<>INFO<46>z1%(py2)s
{%(py2)s = %(py0)s.log_level
} == %(py5)sTr(<00>z3%(py2)s
{%(py2)s = %(py0)s.log_to_file
} is %(py5)s<>z6%(py2)s
{%(py2)s = %(py0)s.log_to_console
} is %(py5)s)r<00>
output_dirr,r-r.r/r0r1r2r3<00>log_dir<69> chart_dirrr<><00>report_filename<6D> log_level<65> log_to_file<6C>log_to_console)r;rr<r=r>r?r@<00> @py_assert6<74> @py_assert8<74> @py_assert10<31> @py_assert12<31> @py_assert13<31> @py_format15<31> @py_format17s rArBz$TestOutputConfig.test_default_config<69>sO<00><00><1D><1E><1E><06>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>A<>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,rCc <00><>
<00>tddddddd<07><08><00>}|j}d}||k}|s<>tjd |fd
||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j
}d}||k}|s<>tjd |fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd |fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd |fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd |fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||u}|s<>tjd|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}|j}d}||u}|s<>tjd|fd||f<02><00>d t j<00><00>vstj|<01><00>rtj|<01><00>nd tj|<02><00>tj|<03><00>d <0C>z}d d|iz}ttj |<06><00><00><00><00>dx}x}}dS)rE<00>results<74>logsr<73>z report.md<6D>DEBUGFT)r<>r<>r<>r<>r<>r<>r<>rr<>rrrrNr<4E>)z1%(py2)s
{%(py2)s = %(py0)s.chart_dir
} == %(py5)sr<73>r<>r(r<>r<>)rr<>r,r-r.r/r0r1r2r3r<>r<>r<>r<>r<>r<>r:s rArNz#TestOutputConfig.test_custom_config<69>s<><00><00><1D> <20><1A><1E>'<27><1D><1D><1F>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> .<2E>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,rCc<00><><00>tjtd<01><02><00>5td<03><04><00>ddd<05><00>dS#1swxYwYdS)u测试无效的 log_level。u不支持的 log_levelrP<00>INVALID)r<>N)rTrUrVrrWs rA<00>test_invalid_log_levelz'TestOutputConfig.test_invalid_log_level<65>s<><00><00> <13>]<5D>:<3A>-E<> F<> F<> F<> .<2E> .<2E> <18>9<EFBFBD> -<2D> -<2D> -<2D> -<2D> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E><><EFBFBD><EFBFBD> .<2E> .<2E> .<2E> .<2E> .<2E> .rYc <00><>
<00>tddd<03><04><00>}|j}|<02><00>}d}t|<04><00>}||k}|<06>stjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<04><00>tj|<05><00>d <09>z}d
d |iz}ttj
|<08><00><00><00><00>d x}x}x}x}}|j }|<02><00>}d}t|<04><00>}||k}|<06>stjd|fd ||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<04><00>tj|<05><00>d <09>z}d
d |iz}ttj
|<08><00><00><00><00>d x}x}x}x}}|j }|<02><00>}d}t|<04><00>}||k}|<06>stjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<04><00>tj|<05><00>d <09>z}d
d |iz}ttj
|<08><00><00><00><00>d x}x}x}x}}|j }|<02><00>}d}t|<04><00>}||k}|<06>stjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<04><00>tj|<05><00>d <09>z}d
d |iz}ttj
|<08><00><00><00><00>d x}x}x}x}}d S)u测试路径获取方法。r<E38082>r<>r<>)r<>r<>r<>r)zn%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_output_path
}()
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}rr)rrr<><00>py6<79>py8<79>py10zassert %(py12)s<>py12N)zk%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_log_path
}()
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})zm%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_chart_path
}()
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}zresults/analysis_report.md)zn%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_report_path
}()
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})r<00>get_output_pathrr,r-r.r/r0r1r2r3<00> get_log_path<74>get_chart_path<74>get_report_path) r;rr<r><00> @py_assert7<74> @py_assert9<74> @py_assert5<74> @py_format11<31> @py_format13s rA<00>test_get_pathszTestOutputConfig.test_get_paths<68>s<><00><00><1D> <20><1A><1E>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> ;<3B>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>M<>MrCN)rdrerfrgrBrNr<>r<>rhrCrAr<>r<>~s[<00><00><00><00><00><00><1F><1F>
-<2D>
-<2D>
-<2D>-<2D>-<2D>-<2D>(.<2E>.<2E>.<2E>
N<01> N<01> N<01> N<01> NrCr<>c<00>N<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z d<08>Z
d <09>Z d
<EFBFBD>Z d <0B>Z d S) <0A>
TestConfigu测试系统配置。c<00><><00>ttd<01><02><00><00><03><00>}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<01><00>rt j |<01><00>ndt j |<02><00>t j |<03><00>t j |<04><00>d<07>z}dd |iz}tt j |<07><00><00><00><00>d
x}x}x}}|j }|j }d }||k}|s<>t jd|fd ||f<02><00>dt j<00><00>vst j|<01><00>rt j |<01><00>ndt j |<02><00>t j |<03><00>t j |<04><00>d<07>z}dd |iz}tt j |<07><00><00><00><00>d
x}x}x}}|j}|j}d }||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<01><00>rt j |<01><00>ndt j |<02><00>t j |<03><00>t j |<04><00>d<07>z}dd |iz}tt j |<07><00><00><00><00>d
x}x}x}}|j}d}||u}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<01><00>rt j |<01><00>ndt j |<02><00>t j |<08><00>d<12>z} dd| iz}tt j |<06><00><00><00><00>d
x}x}}d
S)rrr<00><01>llmr<00>zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.api_key
} == %(py7)sr<00>rrr<>r<00>assert %(py9)sr<73>Nrl<00>zY%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.performance
}.agent_max_rounds
} == %(py7)sr<73><00>zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.output
}.output_dir
} == %(py7)sTr(<00>z>%(py2)s
{%(py2)s = %(py0)s.code_repo_enable_reuse
} is %(py5)srrr)rrr<>rr,r-r.r/r0r1r2r3<00> performancervr<>r<><00>code_repo_enable_reuse)
r;rr<r>r<>r<>r@<00> @py_format10r=r?s
rArBzTestConfig.test_default_config<69>s"<00><00><17><19>*<2A>-<2D>-<2D>-<2D>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> 0<>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4rCc <00>J<00>ddddddddd <09>}tjtj|d
<EFBFBD> <0B><00>5t j<00><00>}|j}|j}d}||k}|s<>tj d |fd ||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d |fd||f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d<0F>z}dd|iz}ttj|<08><00><00><00><00>dx}x}x}}|j}d} || u}|s<>tj d|fd|| f<02><00>dtj <00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj | <09><00>d<1E>z}
dd |
iz}ttj|<07><00><00><00><00>dx}x}} ddd<12><00>dS#1swxYwYdS)!u$测试从环境变量加载配置。r<00> env_test_keyzhttps://test.apiz gpt-3.5-turbo<62>15<31> test_output<75>5000<30>false)<08> LLM_PROVIDER<45>OPENAI_API_KEY<45>OPENAI_BASE_URL<52> OPENAI_MODEL<45>AGENT_MAX_ROUNDS<44>AGENT_OUTPUT_DIR<49>TOOL_MAX_QUERY_ROWS<57>CODE_REPO_ENABLE_REUSET<45><01>clearr<00>zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.provider
} == %(py7)srr<>r<>r<>Nr<4E><00>zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.base_url
} == %(py7)s<>zF%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.model
} == %(py7)s<>r<>r<00>z\%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.performance
}.tool_max_query_rows
} == %(py7)sr<73>Fr(r<>rrr)r<00>dict<63>os<6F>environr<00>from_envr<76>r+r,r-r.r/r0r1r2r3rr4r5r<>rvrxr<>r<>r<>) r;<00>env_varsrr<r>r<>r<>r@r<>r=r?s rA<00> test_from_envzTestConfig.test_from_env<6E>s<><00><00>%<25>,<2C>1<>+<2B> $<24> -<2D>#)<29>&-<2D> 
<EFBFBD> 
<EFBFBD><08><13>Z<EFBFBD><02>
<EFBFBD>H<EFBFBD>D<EFBFBD> 9<> 9<> 9<>
:<3A>
:<3A><1B>_<EFBFBD>&<26>&<26>F<EFBFBD> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> 7<> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> 6<> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> A<> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A><><EFBFBD><EFBFBD>
:<3A>
:<3A>
:<3A>
:<3A>
:<3A>
:s<00>[\<03>\<07>\c<00><><00>ddddd<05>}tjtj|d<06><07><00>5t j<00><00>}|j}|j}d}||k}|s<>tj d|fd ||f<02><00>d
tj <00><00>vstj |<02><00>rtj |<02><00>nd
tj |<03><00>tj |<04><00>tj |<05><00>d <0B>z}d d |iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d|fd||f<02><00>d
tj <00><00>vstj |<02><00>rtj |<02><00>nd
tj |<03><00>tj |<04><00>tj |<05><00>d <0B>z}d d |iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d|fd||f<02><00>d
tj <00><00>vstj |<02><00>rtj |<02><00>nd
tj |<03><00>tj |<04><00>tj |<05><00>d <0B>z}d d |iz}ttj|<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>tj d|fd||f<02><00>d
tj <00><00>vstj |<02><00>rtj |<02><00>nd
tj |<03><00>tj |<04><00>tj |<05><00>d <0B>z}d d |iz}ttj|<08><00><00><00><00>dx}x}x}}ddd<0E><00>dS#1swxYwYdS)u,测试从环境变量加载 Gemini 配置。rFrGrHrI)r<><00>GEMINI_API_KEY<45>GEMINI_BASE_URL<52> GEMINI_MODELTr<54>rr<>rr<>r<>r<>Nr<4E>r<>r<>)rr<>r<>r<>rr<>r<>r+r,r-r.r/r0r1r2r3rr4r5) r;r<>rr<r>r<>r<>r@r<>s rA<00>test_from_env_geminizTestConfig.test_from_env_gemini<6E>s<><00><00>%<25>*<2A>3<>(<28> 
<EFBFBD>
<EFBFBD><08><13>Z<EFBFBD><02>
<EFBFBD>H<EFBFBD>D<EFBFBD> 9<> 9<> 9<> 4<> 4<><1B>_<EFBFBD>&<26>&<26>F<EFBFBD> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> 5<> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> ><3E> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<>  4<> 4<> 4<> 4<> 4<> 4<> 4<> 4<> 4<> 4<> 4<> 4<><34><EFBFBD><EFBFBD> 4<> 4<> 4<> 4<> 4<> 4s<00>NN><03>>O<07>Oc <00><00>ddddddddd <09>d
d d <0C>d dd<0F>dd<11>}tj|<01><00>}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j }d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j }d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d
}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d }||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d }||k}|s<>t jd|fd ||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}|j}d}||k}|s<>t jd|fd!||f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<15>z}dd|iz}tt j |<08><00><00><00><00>dx}x}x}}|j}d} || u}|s<>t jd"|fd#|| f<02><00>dt j<00><00>vst j|<02><00>rt j |<02><00>ndt j |<03><00>t j | <09><00>d$<24>z}
d%d&|
iz}tt j |<07><00><00><00><00>dx}x}} dS)'u测试从字典加载配置。r<00> dict_test_keyzhttps://dict.apir!<00>Zr<>rLi<>rM<00>i@)rvrx<00> dict_outputr<74>)r<>r<>F)r<>r<>r<>r<>rr<>rr<>r<>r<>Nr<4E>)zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.timeout
} == %(py7)s)zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.max_retries
} == %(py7)s)zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.temperature
} == %(py7)s)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.llm
}.max_tokens
} == %(py7)sr<73>r<>r<>)zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.output
}.log_level
} == %(py7)sr(r<>rrr)r<00> from_dictr<74>rr,r-r.r/r0r1r2r3r4r6r7r8r9r<>rvrxr<>r<>r<>r<>) r;<00> config_dictrr<r>r<>r<>r@r<>r=r?s rA<00>test_from_dictzTestConfig.test_from_dict<63>s<> <00><00>%<25>*<2A>.<2E> <20><1D> <20>"<22>"<22> <0E> <0E>%'<27>'+<2B><0E><0E>
,<2C>$<24><0E><0E>',<2C>'
<EFBFBD>
<EFBFBD> <0B>,<18>!<21>+<2B>.<2E>.<2E><06>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5rCc<00><00>|dz }dddd<05>ddid<08>}t|d <09><00>5}tj||<04><00>d
d
d
<EFBFBD><00>n #1swxYwYtjt |<02><00><00><00>}|j}|j}d}||k} | s<>tj d | fd ||f<02><00>d tj <00><00>vstj |<05><00>rtj |<05><00>nd tj |<06><00>tj |<07><00>tj |<08><00>d<0E>z}
dd|
iz} ttj| <0B><00><00><00><00>d
x}x}x} }|j}|j}d}||k} | s<>tj d | fd||f<02><00>d tj <00><00>vstj |<05><00>rtj |<05><00>nd tj |<06><00>tj |<07><00>tj |<08><00>d<0E>z}
dd|
iz} ttj| <0B><00><00><00><00>d
x}x}x} }|j}|j}d}||k} | s<>tj d | fd||f<02><00>d tj <00><00>vstj |<05><00>rtj |<05><00>nd tj |<06><00>tj |<07><00>tj |<08><00>d<0E>z}
dd|
iz} ttj| <0B><00><00><00><00>d
x}x}x} }d
S)u测试从文件加载配置。ztest_config.jsonr<00> file_test_keyr!<00>r+rr5rvr<><00>r<>r<><00>wNrr<>rr<>r<>r<>r<>r<>)<13>open<65>json<6F>dumpr<00> from_filer<65>r<>rr,r-r.r/r0r1r2r3r5r<>rv) r;<00>tmp_path<74> config_filer<65><00>frr<r>r<>r<>r@r<>s rA<00>test_from_filezTestConfig.test_from_files<><00><00><1E>!3<>3<> <0B>%<25>*<2A> <20><0E><0E> #<23>B<EFBFBD><0E> 
<EFBFBD> 
<EFBFBD> <0B><12>+<2B>s<EFBFBD> #<23> #<23> &<26>q<EFBFBD> <10>I<EFBFBD>k<EFBFBD>1<EFBFBD> %<25> %<25> %<25> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26><><EFBFBD><EFBFBD> &<26> &<26> &<26> &<26><18>!<21>#<23>k<EFBFBD>"2<>"2<>3<>3<><06>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8s<00>A<03>A<07>
Ac<00><><00>tjt<00><00>5tjd<01><00>ddd<02><00>dS#1swxYwYdS)u'测试加载不存在的配置文件。znonexistent.jsonN)rTrU<00>FileNotFoundErrorrr<>rWs rA<00>test_from_file_not_foundz#TestConfig.test_from_file_not_found*s<><00><00> <13>]<5D>,<2C> -<2D> -<2D> 1<> 1<> <12> <1C>/<2F> 0<> 0<> 0<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<> 1<><31><EFBFBD><EFBFBD> 1<> 1<> 1<> 1<> 1<> 1s<00><<03>A<07>Ac<00><><00>ttdd<02><03><00>td<04><05><00>td<06><07><00><00><08><00>}|<01><00><00>}|d d
}d }||k}|slt jd |fd ||f<02><00>t j|<03><00>t j|<04><00>d<0E>z}dd|iz}tt j |<07><00><00><00><00>dx}x}}|d d}d}||k}|slt jd |fd ||f<02><00>t j|<03><00>t j|<04><00>d<0E>z}dd|iz}tt j |<07><00><00><00><00>dx}x}}|dd}d}||k}|slt jd |fd ||f<02><00>t j|<03><00>t j|<04><00>d<0E>z}dd|iz}tt j |<07><00><00><00><00>dx}x}}|dd}d}||k}|slt jd |fd ||f<02><00>t j|<03><00>t j|<04><00>d<0E>z}dd|iz}tt j |<07><00><00><00><00>dx}x}}dS)u测试转换为字典。rr!)rr5r<>r<>r<>)r<>)r<>r<>r<>r<>r<00>***r<00>z%(py1)s == %(py4)s<><02>py1r<31><00>assert %(py6)sr<73>Nr5r<>rvr<>r<>)
rrrr<00>to_dictr,r-r1r2r3)r;rr<><00> @py_assert0r><00> @py_assert2<74> @py_format5<74> @py_format7s rA<00> test_to_dictzTestConfig.test_to_dict/sC<00><00><17><19>"<22><1D><0E><0E><0E>*<2A>!#<23><0E><0E><0E> <20>(<28><0E><0E><0E> 
<EFBFBD> 
<EFBFBD> 
<EFBFBD><06><1D>n<EFBFBD>n<EFBFBD>&<26>&<26> <0B>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>C<>CrCc<00><><00>|dz }ttd<02><03><00>td<04><05><00><00><06><00>}|<03>t |<02><00><00><00>|j}|<04><00>}|s<>ddt j<00><00>vstj |<02><00>rtj
|<02><00>ndtj
|<04><00>tj
|<05><00>d <09>z}ttj |<06><00><00><00><00>d
x}}t|d <0B><00>5}tj|<07><00>}d
d
d
<EFBFBD><00>n #1swxYwY|d d } d}| |k}
|
sltjd|
fd| |f<02><00>tj
| <09><00>tj
|<05><00>d<11>z}dd|iz} ttj | <0B><00><00><00><00>d
x} x}
}|dd} d}| |k}
|
sltjd|
fd| |f<02><00>tj
| <09><00>tj
|<05><00>d<11>z}dd|iz} ttj | <0B><00><00><00><00>d
x} x}
}d
S)u测试保存配置到文件。zsaved_config.jsonrrr<>r<>r<>zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r<>)rrr<>N<>rr<72>rrrrrr r<>r<>rv)rrr<00> save_to_filer<65><00>existsr.r/r,r0r1r2r3r<>r<><00>loadr-) r;r<>r<>rr<r>r r<><00>
saved_dictr r rs rA<00>test_save_to_filezTestConfig.test_save_to_fileEs<><00><00><1E>!4<>4<> <0B><17><19>*<2A>-<2D>-<2D>-<2D>)<29>2<EFBFBD>><3E>><3E>><3E>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<0F><1B><1B>C<EFBFBD> <0B>,<2C>,<2C>-<2D>-<2D>-<2D>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23> <11>+<2B>s<EFBFBD> #<23> #<23> &<26>q<EFBFBD><1D><19>1<EFBFBD><1C><1C>J<EFBFBD> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26><><EFBFBD><EFBFBD> &<26> &<26> &<26> &<26> 5<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>B<>Bs<00>D(<03>(D,<07>/D,c<00><><00>ttd<01><02><00><00><03><00>}|j}|<02><00>}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<02><00>tj|<03><00>tj|<04><00>d<08>z}d d
|iz}ttj
|<07><00><00><00><00>d x}x}x}}d S) u测试配置验证成功。rrr<>Tr(<00>zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.validate
}()
} is %(py7)srr<>r<>r<>N) rr<00>validater,r-r.r/r0r1r2r3<00>r;rr<r>r<>r<>r@r<>s rA<00>test_validate_successz TestConfig.test_validate_successXs7<00><00><17><19>*<2A>-<2D>-<2D>-<2D>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> )<29>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(rCc<00><00>ttd<01><02><00><00><03><00>}d|j_|j}|<02><00>}d}||u}|s<>t jd|fd||f<02><00>dtj<00><00>vst j |<01><00>rt j
|<01><00>ndt j
|<02><00>t j
|<03><00>t j
|<04><00>d <09>z}d
d |iz}tt j |<07><00><00><00><00>d x}x}x}}d S) u/测试配置验证失败(缺少 API key。rrr<>rRFr(rrr<>r<>r<>N) rrr<>rrr,r-r.r/r0r1r2r3rs rA<00>test_validate_missing_api_keyz(TestConfig.test_validate_missing_api_key`sA<00><00><17><19>*<2A>-<2D>-<2D>-<2D>
<EFBFBD>
<EFBFBD>
<EFBFBD><06> <20><06>
<EFBFBD><1A>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)rCN)rdrerfrgrBr<>r<>r<>rrrrrrrhrCrAr<>r<><00>s<><00><00><00><00><00><00><1F><1F> 5<> 5<> 5<>:<3A>:<3A>:<3A>24<>4<>4<>"$6<>$6<>$6<>L9<>9<>9<>01<>1<>1<>
D<01>D<01>D<01>,C<01>C<01>C<01>&)<29>)<29>)<29>*<2A>*<2A>*<2A>*<2A>*rCr<>c<00>*<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>ZdS)<07>TestGlobalConfigu测试全局配置管理。c<00><><00>td<01><00>ddi}tjtj|d<04><05><00>5t <00><00>}d}||u}|s<>t jd|fd||f<02><00>dtj <00><00>vst j
|<02><00>rt j |<02><00>ndt j |<03><00>d <09>z}d
d |iz}tt j |<06><00><00><00><00>dx}}|j}|j}d}||k} | s<>t jd | fd ||f<02><00>dtj <00><00>vst j
|<02><00>rt j |<02><00>ndt j |<04><00>t j |<07><00>t j |<08><00>d<0E>z}
dd|
iz} tt j | <0B><00><00><00><00>dx}x}x} }ddd<01><00>dS#1swxYwYdS)u测试获取全局配置。Nr<4E><00>global_test_keyTr<54>)<01>is not)z%(py0)s is not %(py3)sr)r<00>py3zassert %(py5)srrr<>r<>r<>r<>)r
rr<>r<>r<>r r,r-r.r/r0r1r2r3r<>r) r;r<>rr r<<00> @py_format4r?r>r<>r<>r@r<>s rA<00>test_get_configz TestGlobalConfig.test_get_configmsw<00><00> <13>4<EFBFBD><18><18><18> <1D>/<2F>
<EFBFBD><08><13>Z<EFBFBD><02>
<EFBFBD>H<EFBFBD>D<EFBFBD> 9<> 9<> 9<> ;<3B> ;<3B><1F>\<5C>\<5C>F<EFBFBD> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A>  ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B><><EFBFBD><EFBFBD> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;s<00>FG<03>G<07>Gc<00>6<00>ttd<01><02><00><00><03><00>}t|<01><00>t<00><00>}|j}|j}d}||k}|s<>t jd|fd||f<02><00>dtj <00><00>vst j
|<02><00>rt j |<02><00>ndt j |<03><00>t j |<04><00>t j |<05><00>d<07>z}dd |iz}tt j |<08><00><00><00><00>d
x}x}x}}d
S) u测试设置全局配置。<E7BDAE>
custom_keyrr<>rr<>rr<>r<>r<>N)rrr
r r<>rr,r-r.r/r0r1r2r3) r;<00> custom_configrr<r>r<>r<>r@r<>s rA<00>test_set_configz TestGlobalConfig.test_set_config}sH<00><00><1E><19>,<2C>/<2F>/<2F>/<2F>
<EFBFBD>
<EFBFBD>
<EFBFBD> <0A> <13>=<3D>!<21>!<21>!<21><1B><1C><1C><06>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1rCc<00><><00>ddd<03>}tjtj|d<04><05><00>5t <00><00>}|j}|j}d}||k}|s<>tjd|fd||f<02><00>dtj
<00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d <09>z}d
d |iz}ttj|<08><00><00><00><00>d x}x}x}}|j}|j}d }||k}|s<>tjd|fd||f<02><00>dtj
<00><00>vstj |<02><00>rtj |<02><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d <09>z}d
d |iz}ttj|<08><00><00><00><00>d x}x}x}}t#<00><00>} | j}|j}d}||k}|s<>tjd|fd||f<02><00>dtj
<00><00>vstj | <09><00>rtj | <09><00>ndtj |<03><00>tj |<04><00>tj |<05><00>d <09>z}d
d |iz}ttj|<08><00><00><00><00>d x}x}x}}d d d <0C><00>d S#1swxYwYd S)u*测试从环境变量加载全局配置。<E7BDAE>env_global_key<65>25)r<>r<>Tr<54>rr<>rr<>r<>r<>Nr<4E>r<><00> global_config)rr<>r<>r<>r r<>rr,r-r.r/r0r1r2r3r<>rvr )
r;r<>rr<r>r<>r<>r@r<>r-s
rA<00>test_load_config_from_envz*TestGlobalConfig.test_load_config_from_env<6E>s<><00><00>/<2F> $<24>
<EFBFBD>
<EFBFBD><08>
<13>Z<EFBFBD><02>
<EFBFBD>H<EFBFBD>D<EFBFBD> 9<> 9<> 9<> A<01> A<01>)<29>+<2B>+<2B>F<EFBFBD> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>'<27>L<EFBFBD>L<EFBFBD>M<EFBFBD> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40> A<01> A<01> A<01> A<01> A<01> A<01> A<01> A<01> A<01> A<01> A<01> A<01><><EFBFBD><EFBFBD> A<01> A<01> A<01> A<01> A<01> As<00>J4K(<03>(K,<07>/K,c<00>b<00>|dz }ddddd<06>i}t|d<07><00>5}tj||<04><00>ddd<08><00>n #1swxYwYtt |<02><00><00><00>}|j}|j}d}||k} | s<>tjd | fd
||f<02><00>d tj
<00><00>vstj |<05><00>rtj |<05><00>nd tj |<06><00>tj |<07><00>tj |<08><00>d <0C>z}
d d|
iz} ttj| <0B><00><00><00><00>dx}x}x} }t<00><00>} | j}|j}d}||k} | s<>tjd | fd
||f<02><00>dtj
<00><00>vstj | <0C><00>rtj | <0C><00>ndtj |<06><00>tj |<07><00>tj |<08><00>d <0C>z}
d d|
iz} ttj| <0B><00><00><00><00>dx}x}x} }dS)u$测试从文件加载全局配置。zglobal_config.jsonr<6E>r<00>file_global_keyr!r<>r<>Nrr<>rr<>r<>r<>r-)r<>r<>r<>r r<>r<>rr,r-r.r/r0r1r2r3r ) r;r<>r<>r<>r<>rr<r>r<>r<>r@r<>r-s rA<00>test_load_config_from_filez+TestGlobalConfig.test_load_config_from_file<6C>s<><00><00><1E>!5<>5<> <0B> <12>$<24>,<2C> <20><0E><0E>
<EFBFBD> <0B><12>+<2B>s<EFBFBD> #<23> #<23> &<26>q<EFBFBD> <10>I<EFBFBD>k<EFBFBD>1<EFBFBD> %<25> %<25> %<25> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26> &<26><><EFBFBD><EFBFBD> &<26> &<26> &<26> &<26>'<27>s<EFBFBD>;<3B>'7<>'7<>8<>8<><06>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>#<23> <0C> <0C> <0A>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=s<00>A<03>A<07>AN)rdrerfrgr%r)r.r1rhrCrArrjsY<00><00><00><00><00><00>%<25>%<25>;<3B>;<3B>;<3B> 2<> 2<> 2<>A<01>A<01>A<01>"><3E>><3E>><3E>><3E>>rCr)rg<00>builtinsr.<00>_pytest.assertion.rewrite<74> assertion<6F>rewriter,r<>r<>rT<00>pathlibr<00> unittest.mockr<00>
src.configrrrrr r
r r rrjr<>r<>rrhrCrA<00><module>r9s<><00><01>*<2A>*<2A><00><00><00><00><00><00><00><00><00><00><00><00><00> <09> <09> <09> <09> <0B> <0B> <0B> <0B> <0A> <0A> <0A> <0A><18><18><18><18><18><18><1F><1F><1F><1F><1F><1F> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02> <02>86<>86<>86<>86<>86<>86<>86<>86<>v+6<>+6<>+6<>+6<>+6<>+6<>+6<>+6<>\3N<01>3N<01>3N<01>3N<01>3N<01>3N<01>3N<01>3N<01>ls*<2A>s*<2A>s*<2A>s*<2A>s*<2A>s*<2A>s*<2A>s*<2A>lD><3E>D><3E>D><3E>D><3E>D><3E>D><3E>D><3E>D><3E>D><3E>D>rC