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

715 lines
61 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<0B><>i{f<00><00>\<00>dZddlZddlmcmZddlZddlZ ddl
Z ddl m Z mZmZmZddlmZmZddlmZmZddlmZmZmZmZddlmZmZm Z m!Z!ddl"m#Z#m$Z$ej%d <09><00><00>Z&ej%d
<EFBFBD><00><00>Z'ej%d d<0E><01><00>Z(eeeeeee e!gZ)e ej*e)<29><00><00><0F><00>ed<10><11><00>d<12><00><00><00><00>Z+e ej*e)<29><00>e(dd<14><15><00><00><16><00>edd<02><17><00>d<18><00><00><00><00>Z,e e'<27><00><00><19><00>ed<10><11><00>d<1A><00><00><00><00>Z-e ej*e)<29><00>e'<27><00><00><1B><00>ed<10><11><00>d<1C><00><00><00><00>Z.e e'<27><00><00><19><00>ed<10><11><00>d<1D><00><00><00><00>Z/d<1E>Z0d<1F>Z1dS)!u'工具系统的基于属性的测试。<E8AF95>N)<04>given<65>
strategies<EFBFBD>settings<67>assume)<02>Dict<63>Any)<02> AnalysisTool<6F> ToolRegistry)<04>GetColumnDistributionTool<6F>GetValueCountsTool<6F>GetTimeSeriesTool<6F>GetCorrelationTool)<04>CalculateStatisticsTool<6F>PerformGroupbyTool<6F>DetectOutliersTool<6F>CalculateTrendTool)<02> DataProfile<6C>
ColumnInfoc<00><><00>|tjgd<01><01><00><00><00>}t|tjddtjd<04><05><00><00><06><00><00><00>||tjdd<08> <09><00><00><00>|tjdd
<EFBFBD> <09><00><00><00>|tjtj<00><00>dd <0B> <0C><00><00><00>|d kr!d|tjdd<0F><10><00><00><00>ini<00><11><00>S)u$生成随机的 ColumnInfo 实例。)<04>numeric<69> categorical<61>datetime<6D>text<78><00><00><02>Lu<4C>Ll<4C><01>whitelist_categories<65><03>min_size<7A>max_size<7A>alphabet<65>g<00>?<3F><02> min_value<75> max_value<75><65><00><00>r"r#r<00>meanF)<02> allow_nan<61>allow_infinity)<06>name<6D>dtype<70> missing_rate<74> unique_count<6E> sample_values<65>
statistics)<08>st<73> sampled_fromrr<00>
characters<EFBFBD>floats<74>integers<72>lists)<02>drawr0s <20>BD:\code\iov_data_analysis_agent_old\tests\test_tools_properties.py<70>column_info_strategyr=s<><00><00> <11>D<EFBFBD><12><1F>!O<>!O<>!O<>P<>P<> Q<> Q<>E<EFBFBD> <15> <11>T<EFBFBD>"<22>'<27>1<EFBFBD>r<EFBFBD>B<EFBFBD>M<EFBFBD>_k<5F><l<><l<><l<>m<>m<>m<> n<> n<><13><19>T<EFBFBD>"<22>)<29>c<EFBFBD>S<EFBFBD>A<>A<>A<>B<>B<><19>T<EFBFBD>"<22>+<2B><01>T<EFBFBD>B<>B<>B<>C<>C<><1A>d<EFBFBD>2<EFBFBD>8<EFBFBD>B<EFBFBD>K<EFBFBD>M<EFBFBD>M<EFBFBD>A<EFBFBD><01>J<>J<>J<>K<>K<>W\<5C>`i<>Wi<57>Wi<57>F<EFBFBD>D<EFBFBD>D<EFBFBD><12><19>U<EFBFBD>5<EFBFBD>!Q<>!Q<>!Q<>R<>R<>S<>S<>oq<6F>  <06> <06> <06><06>c<00><><00>|tjt<00><00>dd<02><03><00><00><00>}t|tjdd<04><03><00><00><00>|tjdd<05><06><00><00><00>t |<01><00>||tjgd<07><01><00><00><00>i|tjdd <09><06><00><00><00>|tjd
<EFBFBD> <0B><00><00><00><00> <0C><00>S) u%生成随机的 DataProfile 实例。r<00>
r+<00>2i'r&)<04>ticket<65>sales<65>user<65>unknownr%gY@<40>d)r#)<08> file_path<74> row_count<6E> column_count<6E>columns<6E> inferred_type<70>
key_fields<EFBFBD> quality_score<72>summary) r5r:r=rrr9<00>lenr6r8)r;rJs r<<00>data_profile_strategyrP)s<><00><00><13>d<EFBFBD>2<EFBFBD>8<EFBFBD>0<>2<>2<>Q<EFBFBD><12>L<>L<>L<>M<>M<>G<EFBFBD> <16><16>$<24>r<EFBFBD>w<EFBFBD><01>B<EFBFBD>7<>7<>7<>8<>8<><16>$<24>r<EFBFBD>{<7B>Q<EFBFBD>%<25>@<40>@<40>@<40>A<>A<><18><17>\<5C>\<5C><17><1A>d<EFBFBD>2<EFBFBD>?<3F>+Q<>+Q<>+Q<>R<>R<>S<>S<><15><1A>d<EFBFBD>2<EFBFBD>9<EFBFBD>s<EFBFBD>e<EFBFBD>D<>D<>D<>E<>E<><14><04>R<EFBFBD>W<EFBFBD>c<EFBFBD>*<2A>*<2A>*<2A>+<2B>+<2B> <06> <06> <06> r>r@rF<00>c <00><><00>|tj||<02><01><00><00><00>}|tj||<04><01><00><00><00>}i}t|<06><00>D]<5D>}|tjgd<02><01><00><00><00>} d|<08><00>}
| dkr8|tjtjdd<06><01><00>||<05><07><00><00><00>||
<<00>d| dkr:|tjtjd d
d d <0B> <0C><00>||<05><07><00><00><00>||
<<00><>|tjtjd dtjd<0F><10><00><00><11><00>||<05><07><00><00><00>||
<<00><>tj |<07><00>S)u#生成随机的 DataFrame 实例。r&)<03>int<6E>float<61>str<74>col_rSi<18><><EFBFBD>r)r+rTg@<40><>g@<40>@F)r'r(r-r.rr@rrr!)
r5r9<00>ranger6r:r8rr7<00>pd<70> DataFrame) r;<00>min_rows<77>max_rows<77>min_cols<6C>max_cols<6C>n_rows<77>n_cols<6C>data<74>i<>col_type<70>col_names r<<00>dataframe_strategyrd9s<><00><00><12>T<EFBFBD>"<22>+<2B><08>H<EFBFBD>E<>E<>E<> F<> F<>F<EFBFBD> <11>T<EFBFBD>"<22>+<2B><08>H<EFBFBD>E<>E<>E<> F<> F<>F<EFBFBD> <0A>D<EFBFBD> <12>6<EFBFBD>]<5D>]<5D><0F><0F><01><17>4<EFBFBD><02><0F>(?<3F>(?<3F>(?<3F>@<40>@<40>A<>A<><08><1D>!<21>:<3A>:<3A><08> <13>u<EFBFBD> <1C> <1C>!<21>T<EFBFBD>"<22>(<28><12> <0B>e<EFBFBD>t<EFBFBD><<3C><<3C><<3C><1F><1F>#<0E>#<0E>#<0E><0F><0F>D<EFBFBD><18>N<EFBFBD>N<EFBFBD>
<16><17> <20> <20>!<21>T<EFBFBD>"<22>(<28><12> <09>G<EFBFBD>v<EFBFBD><15>_d<5F>e<>e<>e<><1F><1F>#<0E>#<0E>#<0E><0F><0F>D<EFBFBD><18>N<EFBFBD>N<EFBFBD> "<22>T<EFBFBD>"<22>(<28><12><07><11>R<EFBFBD>"<22>-<2D>]i<>:j<>:j<>:j<>k<>k<>k<><1F><1F>#<0E>#<0E>#<0E><0F><0F>D<EFBFBD><18>N<EFBFBD>N<EFBFBD> <0E><<3C><04> <1D> <1D>r>)<01>
tool_classr)<01> max_examplesc<00><>'<00>|<00><00>}t|t<00><00>}|<02>s%tj|j<00>d<01><02><00>dzdt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>nddt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<02><00>d<06>z}ttj
|<03><00><00><00><00>d}d}t||<04><00>}|s<>tj|j<00>d <09><02><00>d
zd t j<00><00>vstjt<00><00>rtjt<00><00>nd dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}|j }t|t<00><00>}|<07>s8tj|j<00>d <0A><02><00>dzdt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<07><00>d<10>z}ttj
|<08><00><00><00><00>dx}}|j }t|<04><00>}d} || k}
|
<EFBFBD>s"tjd|
fd|| f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>tj| <09><00>d<15>z} tj|j<00>d<16><02><00>dzd| iz} ttj
| <0C><00><00><00><00>dx}x}x}
} d}t||<04><00>}|s<>tj|j<00>d<1A><02><00>d
zd t j<00><00>vstjt<00><00>rtjt<00><00>nd dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}|j}t|t<00><00>}|<07>s8tj|j<00>d<1B><02><00>dzdt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>dt j<00><00>vstjt<00><00>rtjt<00><00>ndtj|<07><00>d<10>z}ttj
|<08><00><00><00><00>dx}}|j}t|<04><00>}d} || k}
|
<EFBFBD>s"tjd|
fd|| f<02><00>dt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>tj| <09><00>d<15>z} tj|j<00>d<1E><02><00>dzd| iz} ttj
| <0C><00><00><00><00>dx}x}x}
} d}t||<04><00>}|s<>tj|j<00>d <20><02><00>d
zd t j<00><00>vstjt<00><00>rtjt<00><00>nd dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}|j}t|t$<00><00>}|<07>s8tj|j<00>d!<21><02><00>d"zdt j<00><00>vstjt<00><00>rtjt<00><00>nddt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>d#t j<00><00>vstjt$<00><00>rtjt$<00><00>nd#tj|<07><00>d<10>z}ttj
|<08><00><00><00><00>dx}}|j} d$}|| v}|s<>tjd%|fd&|| f<02><00>tj|<0E><00>d't j<00><00>vstj| <0A><00>rtj| <0A><00>nd'd(<28>z}tj|j<00>d)<29><02><00>d*zd+|iz}ttj
|<06><00><00><00><00>dx}}| d$}d,}||k}|s<>tjd-|fd.||f<02><00>tj|<0E><00>tj|<02><00>d/<2F>z}tj|j<00>d0<64><02><00>d1zd2|iz}ttj
|<08><00><00><00><00>dx}x}}d3}t||<04><00>}|s<>tj|j<00>d4<64><02><00>d
zd t j<00><00>vstjt<00><00>rtjt<00><00>nd dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}|j}t)|<04><00>}|s<>tj|j<00>d5<64><02><00>d6zd7t j<00><00>vstjt(<00><00>rtjt(<00><00>nd7dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}d8}t||<04><00>}|s<>tj|j<00>d9<64><02><00>d
zd t j<00><00>vstjt<00><00>rtjt<00><00>nd dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}|j}t)|<04><00>}|s<>tj|j<00>d:<3A><02><00>d;zd7t j<00><00>vstjt(<00><00>rtjt(<00><00>nd7dt j<00><00>vstj|<01><00>rtj|<01><00>ndtj|<04><00>tj|<05><00>d <0C>z}ttj
|<06><00><00><00><00>dx}}t-jgd<<3C>gd=<3D>d><3E><02><00>} |<01>|<10><00>}n$#t0t2t4f$r
}Yd}~nd}~wwxYw|j d?kr|<01>|d@<40>A<EFBFBD><00>}<11>nn|j dBkr|<01>|d@<40>A<EFBFBD><00>}<11>nJ|j dCkr|<01>|d@<40>A<EFBFBD><00>}<11>n&|j dDkr|<01>|dE<64>F<EFBFBD><00>}<11>n|j dGkr|<01>|d@<40>A<EFBFBD><00>}n<>|j dHkr1t-jgd<<3C>gdI<64>d><3E><02><00>}|<01>|<13><00>}n<>|j dJkrEt-jt-jdKdL<64>M<EFBFBD><00>gd<<3C>dN<64><02><00>}|<01>|dO<64>P<EFBFBD><00>}nS|j dQkrFt-jt-jdKdL<64>M<EFBFBD><00>gd<<3C>dN<64><02><00>}|<01>|dOdR<64>S<EFBFBD><00>}ndSt|t$<00><00>}|<02>s4tj|j<00>dTt9|<11><00><00><00><03><00>dzdt j<00><00>vstjt<00><00>rtjt<00><00>nddUt j<00><00>vstj|<11><00>rtj|<11><00>ndUd#t j<00><00>vstjt$<00><00>rtjt$<00><00>nd#tj|<02><00>d<06>z}ttj
|<03><00><00><00><00>d}dS)Vu 
属性 10对于任何工具它应该实现标准接口name, description, parameters,
execute, is_applicable并且 execute 方法应该接受 DataFrame 和参数,
返回字典格式的聚合结果。
验证需求FR-4.1
u 不是 AnalysisTool 的子类<E5AD90>7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}<7D>
isinstance<EFBFBD>toolr <00><04>py0<79>py1<79>py2<79>py4Nr/u 缺少 name 属性z7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}<7D>hasattr<74>rlrm<00>py3<79>py5u.name 不是字符串zQ
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.name
}, %(py4)s)
}rU)rlrmrrro<00>py6r)<01>>)zI%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.name
})
} > %(py8)srO)rlrmrrrs<00>py8u.name 是空字符串z
>assert %(py10)s<>py10<31> descriptionu 缺少 description 属性u.description 不是字符串zX
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.description
}, %(py4)s)
})zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.description
})
} > %(py8)su.description 是空字符串<E7ACA6>
parametersu 缺少 parameters 属性u.parameters 不是字典zW
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.parameters
}, %(py4)s)
}<7D>dict<63>type)<01>in)z%(py1)s in %(py3)s<>params)rmrru .parameters 缺少 'type' 字段<E5AD97>
>assert %(py5)srs<00>object<63><01>==)z%(py1)s == %(py4)s)rmrou .parameters.type 不是 'object'z
>assert %(py6)srt<00>executeu 缺少 execute 方法u.execute 不可调用zK
>assert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.execute
})
}<7D>callable<6C> is_applicableu 缺少 is_applicable 方法u.is_applicable 不可调用zQ
>assert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.is_applicable
})
})rrQ<00><00>r*)<05>a<>b<>c<>d<>e)<02>col_0<5F>col_1<5F>get_column_distributionr<6E><00><01>column<6D>get_value_counts<74>calculate_statistics<63>perform_groupbyr<79><00><01>group_by<62>detect_outliers<72>get_correlation)rQr<><00><00>r@<00>get_time_series<65>
2020-01-01r*<00><01>periods)<02>time<6D>valuer<65><00><01> time_column<6D>calculate_trendr<64><00>r<><00> value_columnu(.execute 返回值不是字典,而是 <20>result)rir <00>
@pytest_ar<61>_format_assertmsg<73>__name__<5F> @py_builtins<6E>locals<6C>_should_repr_global_name<6D> _saferepr<70>AssertionError<6F>_format_explanationrpr/rUrO<00>_call_reprcomparerxryrzr<>r<>r<>rXrY<00>KeyError<6F>
ValueError<EFBFBD> TypeError<6F>
date_ranger{)rerj<00> @py_assert3<74> @py_format5<74> @py_assert2<74> @py_assert4<74> @py_format6<74> @py_assert5<74> @py_format7<74> @py_assert7<74> @py_assert6<74> @py_format9<74> @py_format11r}<00> @py_assert0<74> @py_format4<74>test_dfr<66>r<><00>test_df_numeric<69> test_df_time<6D> test_df_trends r<<00>test_tool_interface_consistencyr<79>hs\<00><00> <16>:<3A><<3C><<3C>D<EFBFBD>b<01>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<>N<01>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<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>T<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>\<01>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>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<>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<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<>Z<01>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>Y<>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E>^<5E><12>_<EFBFBD>F<EFBFBD>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>U<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>_<>T<01>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>S<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>
<EFBFBD>(
<EFBFBD> <0B> <0B><0F><16><1C><1C>o<EFBFBD>.<2E>.<2E><06><06> <0A><19>'<27> '<27> '<27><19>|<7C><16>M<EFBFBD>,<2C><01>:<3A>:<3A>:<3A>$<24>_<EFBFBD>_<EFBFBD>%
<EFBFBD>%
<EFBFBD> <0B> <0B> <0C><16><1C><1C>l<EFBFBD><06><1C>?<3F>?<3F><06><06> <0A><19>'<27> '<27> '<27><1A> <0C><16>M<EFBFBD>,<2C><01>:<3A>:<3A>:<3A>$<24>_<EFBFBD>_<EFBFBD>&
<EFBFBD>&
<EFBFBD> <0B> <0B> <0A><16><1C><1C>m<EFBFBD><16>g<EFBFBD><1C>V<>V<><06><06> <0F><06>t<01>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>ss<00>B5AC <00>C AC,<03>C'AC,<03><>i<>)rZr[)re<00>df)rf<00>deadlinec
<00><> <00><12><13>|<00><00>}tt|<01><00>dk<00><00>d<02> |jdkr'|jd}|<02>||d<05><06><00><00><13>ny|jdkr&|jd}|<02>||<03><08><00><00><13>nH|jd krX|<01>t jg<01>
<EFBFBD><00>j}t|<04><00>dkr|<02>||d<00><08><00><00><13>n<>|jd kr$|<02>||jd<00> <0C><00><00><13>n<>|jd krX|<01>t jg<01>
<EFBFBD><00>j}t|<04><00>dkr|<02>||d<00><08><00><00><13>nS|jdkrO|<01>t jg<01>
<EFBFBD><00>j}t|<04><00>dkr|<02>|<01><00><00>n<>|jdkrR|<01><00><00>}tj
dt|<01><00><00><12><00>|d<|<02>|d<13><14><00><00>n<>|jdkr<>|<01>t jg<01>
<EFBFBD><00>j}t|<04><00>dkrX|<01><00><00>}tj
dt|<01><00><00><12><00>|d<|<02>|d|d<00><16><00><00>n3#tttf$r}td<17><00>Yd}~nd}~wwxYw<01><13>td<17><00>d<18>vrtd<17><00>t<00>t<00><00>}|<07>s&t!jd|j<00>d<1A><03><00>dzdt%j<00><00>vst!jt<00><00>rt!jt<00><00>nddt%j<00><00>vst!j<00><13><00>rt!j<00><13><00>nddt%j<00><00>vst!jt<00><00>rt!jt<00><00>ndt!j|<07><00>d<1F>z}t-t!j|<08><00><00><00><00>d}d7<64>fd!<21> <09><00><12><13><00>} d"}
| |
k} | s<>t!jd#| fd$| |
f<02><00>d%t%j<00><00>vst!j| <09><00>rt!j| <09><00>nd%t!j|
<EFBFBD><00>d&<26>z} t!jd|j<00>d'| <09>d(t|<01><00><00>d)<29><07><00>d*zd+| iz} t-t!j| <0A><00><00><00><00>dx} }
| dkr<>| t|<01><00>z }d,}
||
k} | s<>t!jd#| fd$||
f<02><00>d-t%j<00><00>vst!j|<0E><00>rt!j|<0E><00>nd-t!j|
<EFBFBD><00>d&<26>z} t!jd|j<00>d.|d/<2F>d0<64><05><00>d*zd+| iz} t-t!j| <0A><00><00><00><00>dx} }
gd1<64>}t3<00>fd2<64>|D<00><00><00><00>}| dkr<>|s<>t!jd|j<00>d3<64><03><00>d4zd5d6t%j<00><00>vst!j|<10><00>rt!j|<10><00>nd6iz}t-t!j|<11><00><00><00><00>dSdS)8u 
属性 19对于任何工具的执行结果返回的数据应该是聚合后的如统计值、
分组计数、图表数据单次返回的数据行数不应超过100行并且不应包含
完整的原始数据表。
验证需求约束条件5.3
r<>Nr<4E>rr@)r<><00>top_nr<6E>r<>r<>)<01>includer<65>r<>r<>r<>rQr<>r<>r<><00>time_colr<6C>r<>r<>F<>error<6F>工具 u 返回值不是字典rhrir<>rzrkr*c<00><><00><01>|dkrdSt|t<00><00>rt|<00><00>St|t<00><00>r:d}|<00><00><00>D]!}<00>||dz
<00><00>}t ||<04><00>}<02>"|SdS)u$递归计数结果中的数据行数rr)ri<00>listrOrz<00>values<65>max)<06>obj<62> max_depth<74> max_countr<74><00>count<6E>count_data_rowss <20>r<r<>z3test_tool_output_filtering.<locals>.count_data_rows s<><00><><00> <14><01>><3E>><3E><14>1<EFBFBD> <15>c<EFBFBD>4<EFBFBD> <20> <20> <15><16>s<EFBFBD>8<EFBFBD>8<EFBFBD>O<EFBFBD> <17><03>T<EFBFBD> "<22> "<22> <15><19>I<EFBFBD><1C><1A><1A><1C><1C> 2<> 2<><05>'<27><0F><05>y<EFBFBD>1<EFBFBD>}<7D>=<3D>=<3D><05><1F> <09>5<EFBFBD>1<>1<> <09> <09><1C> <1C><14>1r>rF)<01><=)z%(py0)s <= %(py3)s<>max_rows_in_result)rlrru 返回了 u8 行数据超过了100行的限制。原始数据有 u 行。r~rsg333333<33>?<3F>compression_ratiou 的输出压缩比 z.2%uC 太高,可能返回了过多的原始数据而不是聚合结果)r<><00>sumr,<00>median<61>std<74>minr<6E><00> distribution<6F>groups<70> correlationr4<00> time_series<65> aggregation<6F> value_countsc3<00>^<00>K<00>|]'}|t<00><02><00><00><00><00>vV<00><00>(dS<00>N)rU<00>lower)<03>.0<EFBFBD> indicatorr<72>s <20>r<<00> <genexpr>z-test_tool_output_filtering.<locals>.<genexpr>PsN<00><><00><00><00><06><06> <15> <12>S<EFBFBD><16>[<5B>[<5B>&<26>&<26>(<28>(<28>(<28><06><06><06><06><06>r>uX 的结果似乎不包含聚合信息可能返回了原始数据而不是聚合结果<E7BB93>
>assert %(py0)srl<00>has_aggregation)r*)rrOr/rJr<><00> select_dtypes<65>np<6E>number<65>copyrXr<>r<>r<>r<>rirzr<>r<>r<>r<>r<>r<>r<>r<>r<><00>any)rer<>rjrc<00> numeric_cols<6C> df_with_timer<65>r<>r<>r<>r<><00> @py_assert1r<31>r<>r<><00>aggregation_indicatorsr<73><00> @py_format1r<31>r<>s @@r<<00>test_tool_output_filteringr<67><00>s<><00><><EFBFBD><00> <16>:<3A><<3C><<3C>D<EFBFBD> <0B>3<EFBFBD>r<EFBFBD>7<EFBFBD>7<EFBFBD>c<EFBFBD>><3E><1A><1A><1A><12>F<EFBFBD>1<16> <0F>9<EFBFBD>1<> 1<> 1<><19>z<EFBFBD>!<21>}<7D>H<EFBFBD><19>\<5C>\<5C>"<22>X<EFBFBD>R<EFBFBD>\<5C>@<40>@<40>F<EFBFBD>F<EFBFBD> <11>Y<EFBFBD>,<2C> ,<2C> ,<2C><19>z<EFBFBD>!<21>}<7D>H<EFBFBD><19>\<5C>\<5C>"<22>X<EFBFBD>\<5C>6<>6<>F<EFBFBD>F<EFBFBD> <11>Y<EFBFBD>0<> 0<> 0<><1D>+<2B>+<2B>R<EFBFBD>Y<EFBFBD>K<EFBFBD>+<2B>@<40>@<40>H<>L<EFBFBD><12><<3C> <20> <20>1<EFBFBD>$<24>$<24><1D><1C><1C>b<EFBFBD><1C>a<EFBFBD><1F><1C>A<>A<><06><> <11>Y<EFBFBD>+<2B> +<2B> +<2B><19>\<5C>\<5C>"<22>r<EFBFBD>z<EFBFBD>!<21>}<7D>\<5C>=<3D>=<3D>F<EFBFBD>F<EFBFBD> <11>Y<EFBFBD>+<2B> +<2B> +<2B><1D>+<2B>+<2B>R<EFBFBD>Y<EFBFBD>K<EFBFBD>+<2B>@<40>@<40>H<>L<EFBFBD><12><<3C> <20> <20>1<EFBFBD>$<24>$<24><1D><1C><1C>b<EFBFBD><1C>a<EFBFBD><1F><1C>A<>A<><06><> <11>Y<EFBFBD>+<2B> +<2B> +<2B><1D>+<2B>+<2B>R<EFBFBD>Y<EFBFBD>K<EFBFBD>+<2B>@<40>@<40>H<>L<EFBFBD><12><<3C> <20> <20>A<EFBFBD>%<25>%<25><1D><1C><1C>b<EFBFBD>)<29>)<29><06><> <11>Y<EFBFBD>+<2B> +<2B> +<2B><1D>7<EFBFBD>7<EFBFBD>9<EFBFBD>9<EFBFBD>L<EFBFBD>')<29>}<7D>\<5C>3<EFBFBD>r<EFBFBD>7<EFBFBD>7<EFBFBD>'S<>'S<>'S<>L<EFBFBD><1A> $<24><19>\<5C>\<5C>,<2C>J<EFBFBD>\<5C>G<>G<>F<EFBFBD>F<EFBFBD> <11>Y<EFBFBD>+<2B> +<2B> +<2B><1D>+<2B>+<2B>R<EFBFBD>Y<EFBFBD>K<EFBFBD>+<2B>@<40>@<40>H<>L<EFBFBD><12><<3C> <20> <20>1<EFBFBD>$<24>$<24>!<21>w<EFBFBD>w<EFBFBD>y<EFBFBD>y<EFBFBD> <0C>+-<2D>=<3D><1C>s<EFBFBD>SU<53>w<EFBFBD>w<EFBFBD>+W<>+W<>+W<> <0C>Z<EFBFBD>(<28><1D><1C><1C>l<EFBFBD>
<EFBFBD>Ye<EFBFBD>fg<EFBFBD>Yh<EFBFBD><1C>i<>i<><06><><EFBFBD> <14>j<EFBFBD>)<29> ,<2C><16><16><16> <0F>u<EFBFBD> <0A> <0A> <0A> <0A> <0A> <0A> <0A> <0A><><EFBFBD><EFBFBD><EFBFBD><16><><EFBFBD><EFBFBD> <0E>~<7E><0E>u<EFBFBD> <0A> <0A> <0A><0F>&<26><18><18><0E>u<EFBFBD> <0A> <0A> <0A>Q<01>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<>P<><15><15><15><15><15><15>&)<29><1F><16>0<>0<><16><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><06><1A>A<EFBFBD><1D><1D>.<2E><13>R<EFBFBD><17><17>8<><19>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06><06><06><1A> <1A><06><06><06><06>/<2F><06><06><06><06><06>O<EFBFBD> <1A>A<EFBFBD><1D><1D>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><1E><1D>
<EFBFBD>
s<00>J+K<00>L <03>3L<03>L )<01> data_profilec<00><><00><15><16>ddlm}t<00><00>}tD]}|<02>|<03><00><00><00><00> ||<02><00>}|<04>|<00><00>}d<03>|D<00><00><00>t d<04>|jD<00><00><00><00>}gd<05>}|r<>t <00>fd<06>|D<00><00><00><00>}|s}tj d<07><16><00><02><00>dzd d
tj <00><00>vstj |<08><00>rtj |<08><00>nd
iz} ttj| <09><00><00><00><00>t d <0B>|jD<00><00><00><00>}
gd <0C>} |
r<EFBFBD>t <00>fd <0A>| D<00><00><00><00>} | s}tj d<0E><16><00><02><00>dzd dtj <00><00>vstj | <0C><00>rtj | <0C><00>ndiz} ttj| <09><00><00><00><00>t d<10>|jD<00><00><00><00>} gd<11>}| r<>t <00>fd<12>|D<00><00><00><00>}|s}tj d<13><16><00><02><00>dzd dtj <00><00>vstj |<0F><00>rtj |<0F><00>ndiz} ttj| <09><00><00><00><00>gd<15><01>t <00>fd<16>|jD<00><00><00><00>}dg}|s<>t <00>fd<18>|D<00><00><00><00>}| }|s}tj d<19><16><00><02><00>dzd dtj <00><00>vstj |<12><00>rtj |<12><00>ndiz}ttj|<14><00><00><00><00>d}dSdS)u<>
属性 9对于任何数据画像工具管理器选择的工具集应该与数据特征匹配
包含时间字段时启用时间序列工具,包含分类字段时启用分布分析工具,
包含数值字段时启用统计工具,不包含地理字段时不启用地理工具。
验证需求:工具动态性验收.1, 工具动态性验收.2, FR-4.2
r<00><01> ToolManagerc<00><00>g|] }|j<00><02>
S<00>)r/)r<>rjs r<<00>
<listcomp>z4test_tool_selection_adaptability.<locals>.<listcomp>ss<00><00>@<40>@<40>@<40><14>4<EFBFBD>9<EFBFBD>@<40>@<40>@r>c3<00>,K<00>|]}|jdkV<00><00>dS<00>rN<>r0<00>r<><00>cols r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr>v<00>)<00><00><00><00>O<>O<>3<EFBFBD>s<EFBFBD>y<EFBFBD>J<EFBFBD>.<2E>O<>O<>O<>O<>O<>Or><00>r<>r<><00>create_line_chartc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<><00>r<><00> tool_name<6D>selected_tool_namess <20>r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr>{s)<00><><00><00><00>`<60>`<60><19>I<EFBFBD>)<<3C><<3C>`<60>`<60>`<60>`<60>`<60>`r>uQ数据包含时间字段但没有选择时间序列工具。选中的工具r<EFBC9A>rl<00> has_time_toolc3<00>,K<00>|]}|jdkV<00><00>dS<00>rNrrs r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E><00>)<00><00><00><00>U<>U<><13>#<23>)<29>}<7D>4<>U<>U<>U<>U<>U<>Ur><00>r<>r<>r<><00>create_bar_chart<72>create_pie_chartc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<>rs <20>r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E>s)<00><><00><00><00>_<>_<> <09>9<EFBFBD>(;<3B>;<3B>_<>_<>_<>_<>_<>_r>uQ数据包含分类字段但没有选择分类分析工具。选中的工具<E585B7> has_cat_toolc3<00>,K<00>|]}|jdkV<00><00>dS<00>rNrrs r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E><00>)<00><00><00><00>M<>M<><13>c<EFBFBD>i<EFBFBD>9<EFBFBD>,<2C>M<>M<>M<>M<>M<>Mr><00>r<>r<>r<><00>create_heatmapc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<>rs <20>r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E>s)<00><><00><00><00>[<5B>[<5B> <09>9<EFBFBD>(;<3B>;<3B>[<5B>[<5B>[<5B>[<5B>[<5B>[r>uQ数据包含数值字段但没有选择统计分析工具。选中的工具<E585B7> has_num_tool)<08>lat<61>lon<6F>latitude<64> longitude<64>location<6F>address<73>city<74>countryc3<00>P<00><01>K<00>|]<1F>t<00>fd<00><08>D<00><00><00><00>V<00><00> dS)c3<00>N<00>K<00>|]}|<01>j<00><00><00>vV<00><00> dSr<>)r/r<>)r<><00>keywordrs <20>r<r<>z=test_tool_selection_adaptability.<locals>.<genexpr>.<genexpr><3E>s4<00><><00><00><00> D<> D<>G<EFBFBD>G<EFBFBD>s<EFBFBD>x<EFBFBD>~<7E>~<7E>'<27>'<27> '<27> D<> D<> D<> D<> D<> Dr>N)r<>)r<>r<00> geo_keywordss @<40>r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E>sU<00><><EFBFBD><00><00><00><06><06> <0F> <0C> D<> D<> D<> D<>|<7C> D<> D<> D<>D<>D<><06><06><06><06><06>r><00>create_map_visualizationc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<>rs <20>r<r<>z3test_tool_selection_adaptability.<locals>.<genexpr><3E>s)<00><><00><00><00>W<>W<> <09>9<EFBFBD>(;<3B>;<3B>W<>W<>W<>W<>W<>Wr>uK数据不包含地理字段但选择了地理工具。选中的工具<E585B7>
>assert not %(py0)s<> has_geo_toolN)<10>src.tools.tool_managerr<72>r
<00> ALL_TOOLS<4C>register<65> select_toolsr<73>rJr<>r<>r<>r<>r<>r<>r<>r<>)r<>r<><00>registryre<00>manager<65>selected_tools<6C> has_datetime<6D>time_series_toolsr r<><00>has_categorical<61>categorical_toolsr<00> has_numeric<69> numeric_toolsr<00>has_geo<65> geo_toolsr*r<><00> @py_format2r&r
s @@r<<00> test_tool_selection_adaptabilityr;^s<><00><><EFBFBD><00>3<>2<>2<>2<>2<>2<><1C>~<7E>~<7E>H<EFBFBD><1F>(<28>(<28>
<EFBFBD><10><19><19>*<2A>*<2A>,<2C>,<2C>'<27>'<27>'<27>'<27><19>k<EFBFBD>(<28>#<23>#<23>G<EFBFBD><1D>)<29>)<29>,<2C>7<>7<>N<EFBFBD>@<40>@<40><1E>@<40>@<40>@<40><17><17>O<>O<>,<2C>:N<>O<>O<>O<>O<>O<>L<EFBFBD>S<>S<>S<><15><13>
<EFBFBD><1B>`<60>`<60>`<60>`<60>N_<4E>`<60>`<60>`<60>`<60>`<60> <0A>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <1A>U<>U<> <0C>@T<>U<>U<>U<>U<>U<>O<EFBFBD>@<01>@<01>@<01><15><17>
<EFBFBD><1A>_<>_<>_<>_<>M^<5E>_<>_<>_<>_<>_<> <0C>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <16>M<>M<> <0C>8L<38>M<>M<>M<>M<>M<>K<EFBFBD>d<>d<>d<>M<EFBFBD><12>
<EFBFBD><1A>[<5B>[<5B>[<5B>[<5B>]<5D>[<5B>[<5B>[<5B>[<5B>[<5B> <0C>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> e<01>d<>d<>L<EFBFBD><11><06><06><06><06><1F>'<27><06><06><06><06><06>G<EFBFBD>,<2C>,<2C>I<EFBFBD> <12>
<EFBFBD><1A>W<>W<>W<>W<>Y<EFBFBD>W<>W<>W<>W<>W<> <0C>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
r>)rer<>c<00>0 <00>|<00><00>}|<02>|<01><00>}t|t<00><00>}|<04>s5tjd|j<00>dt |<03><00><00><00><04><00>dzdtj<00><00>vstj t<00><00>rtj
t<00><00>nddtj<00><00>vstj |<03><00>rtj
|<03><00>nddtj<00><00>vstj t<00><00>rtj
t<00><00>ndtj
|<04><00>d<07>z}ttj |<05><00><00><00><00>d}|jd v<00>ratd
<EFBFBD>|jD<00><00><00><00>}|jd kr<>td <0C>|jD<00><00><00><00>}|r<>|r<>|s<>tjd|j<00>d <0A><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz}ttj |<08><00><00><00><00>dSdSdS|r<>|s<>tjd|j<00>d<10><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz}ttj |<08><00><00><00><00>dSdS|jdvr<>td<12>|jD<00><00><00><00>}|r<>|s<>tjd|j<00>d<13><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz}ttj |<08><00><00><00><00>dSdS|jdk<00>r9d<15>|jD<00><00>} t| <09><00>dk}
|
r<EFBFBD>|s<>tjd|j<00>d<17><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz}ttj |<08><00><00><00><00>dS| } | s<>tjd|j<00>d<18><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz} ttj | <0C><00><00><00><00>d} dS|jdk<00>r9d<1B>|jD<00><00>} t| <09><00>dk}
|
r<EFBFBD>|s<>tjd|j<00>d<17><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz}ttj |<08><00><00><00><00>dS| } | s<>tjd|j<00>d<18><03><00>dzddtj<00><00>vstj |<03><00>rtj
|<03><00>ndiz} ttj | <0C><00><00><00><00>d} dSdS)u<>
属性 11对于任何工具和数据画像工具的 is_applicable 方法应该正确判断
该工具是否适用于当前数据(例如时间序列工具只适用于包含时间字段的数据)。
验证需求FR-4.3
r<>u1 的 is_applicable 方法返回了非布尔值rhrir<><00>boolrkN)r<>r<>c3<00>,K<00>|]}|jdkV<00><00>dSrrrs r<r<>z3test_tool_applicability_judgment.<locals>.<genexpr><3E>s)<00><00><00><00>S<>S<>s<EFBFBD>3<EFBFBD>9<EFBFBD>
<EFBFBD>2<>S<>S<>S<>S<>S<>Sr>r<>c3<00>,K<00>|]}|jdkV<00><00>dSrrrs r<r<>z3test_tool_applicability_judgment.<locals>.<genexpr><3E>s)<00><00><00><00>U<>U<><13>c<EFBFBD>i<EFBFBD>9<EFBFBD>4<>U<>U<>U<>U<>U<>Ur>u[ 应该适用于包含时间字段和数值字段的数据,但 is_applicable 返回 Falser<65>rluL 应该适用于包含时间字段的数据,但 is_applicable 返回 False)r<>r<>c3<00>,K<00>|]}|jdkV<00><00>dSrrrs r<r<>z3test_tool_applicability_judgment.<locals>.<genexpr><3E>s)<00><00><00><00>Q<>Q<>S<EFBFBD>#<23>)<29>y<EFBFBD>0<>Q<>Q<>Q<>Q<>Q<>Qr>uL 应该适用于包含数值字段的数据,但 is_applicable 返回 Falser<65>c<00>(<00>g|]}|jdk<00> |<01><02>S<00>rrrs r<r<>z4test_tool_applicability_judgment.<locals>.<listcomp><3E><00>$<00><00>V<>V<>V<><03>s<EFBFBD>y<EFBFBD>I<EFBFBD>?U<>?U<><03>?U<>?U<>?Ur>rQuX 应该适用于包含至少两个数值字段的数据,但 is_applicable 返回 FalseuR 不应该适用于数值字段少于2个的数据但 is_applicable 返回 Truer)rc<00>(<00>g|]}|jdk<00> |<01><02>SrBrrs r<r<>z4test_tool_applicability_judgment.<locals>.<listcomp><3E>rCr>)r<>rir=r<>r<>r/r{r<>r<>r<>r<>r<>r<>r<>rJrO) rer<>rjr<>r<>r<>r2r6r<>r<><00>has_enough_numericr<63>r:s r<<00> test_tool_applicability_judgmentrF<00>s
<00><00> <16>:<3A><<3C><<3C>D<EFBFBD><19>&<26>&<26>|<7C>4<>4<>M<EFBFBD><06><06><06><06><06><06><06><06><06><04><06><06><05><06><06><06><06><06><06><06><06><06><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><04><06><06><06><06><06><06><04><06><06><06><06><06><06><06><06><06><04><06><06><06><06><06><06><06><06> <0C>y<EFBFBD>:<3A>:<3A>:<3A><1A>S<>S<>l<EFBFBD>>R<>S<>S<>S<>S<>S<> <0C> <10>9<EFBFBD>)<29> )<29> )<29><1D>U<>U<> <0C>@T<>U<>U<>U<>U<>U<>K<EFBFBD><1B> <12> <0B> <12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12> <12><12><12><12><12><12><06><12><12><12><12><12> <12><12><12><12><12><12><12><12><12><12><12><06><12><12><12><12><12><12> <12> <12> <12> <12><12><12> <1C> <12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12><12> <12><12><12><12><12><12><06><12><12><12><12><12> <12><12><12><12><12><12><12><12><12><12><12><06><12><12><12><12><12><12> <12> <12><12><12>
<0E><19>A<> A<> A<><19>Q<>Q<>L<EFBFBD><P<>Q<>Q<>Q<>Q<>Q<> <0B> <16> <0E> <0E> <0E> <0E><06> <0E> <0E>
<0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E>
<0E><19>'<27> '<27> '<27>V<>V<>|<7C>';<3B>V<>V<>V<> <0C> <20><1C>.<2E>.<2E>!<21>3<><1A> <1D> <0E> <0E> <0E> <0E><06> <0E> <0E>
<0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E>  <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E>
<0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E>
<0E><19>&<26> &<26> &<26>V<>V<>|<7C>';<3B>V<>V<>V<> <0C> <20><1C>.<2E>.<2E>!<21>3<><1A> <1D> <0E> <0E> <0E> <0E><06> <0E> <0E>
<0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E>  <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E>
<0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><06> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E>
'<27> &r>c<00>8<00><0F>ddlm}t<00><00>}||<02><00>}|<03><00><00>|<03>|<00><00>}|<03><00><00><00>t d<03>|jD<00><00><00><00>}t d<04>|jD<00><00><00><00>}t d<05>|jD<00><00><00><00>}|r<>gd<06>}t <00>fd<07>|D<00><00><00><00>} | s}tj d<08><0F><00><02><00>d zd
d tj <00><00>vstj | <09><00>rtj | <09><00>nd iz}
ttj|
<EFBFBD><00><00><00><00>|r<>gd <0C>} t <00>fd <0A>| D<00><00><00><00>} | s}tj d<0E><0F><00><02><00>d zd
dtj <00><00>vstj | <0C><00>rtj | <0C><00>ndiz}
ttj|
<EFBFBD><00><00><00><00>|r<>gd<10>} t <00>fd<11>| D<00><00><00><00>}|stj d<12><0F><00><02><00>d zd
dtj <00><00>vstj |<0E><00>rtj |<0E><00>ndiz}
ttj|
<EFBFBD><00><00><00><00>dSdS)u<>
属性 12对于任何分析任务和可用工具集如果任务需要的工具不在可用工具集中
工具管理器应该能够识别缺失的工具并记录需求。
验证需求:工具动态性验收.3, FR-4.2
rr<>c3<00>,K<00>|]}|jdkV<00><00>dSrrrs r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>#rr>c3<00>,K<00>|]}|jdkV<00><00>dSr rrs r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>$rr>c3<00>,K<00>|]}|jdkV<00><00>dSrrrs r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>%rr>rc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<><00>r<>rj<00> missing_toolss <20>r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>*s(<00><><00><00><00>#Q<>#Q<>d<EFBFBD>D<EFBFBD>M<EFBFBD>$9<>#Q<>#Q<>#Q<>#Q<>#Q<>#Qr>u`数据包含时间字段但没有识别出缺失的时间序列工具。缺失工具列表r<EFBC9A>rl<00>has_missing_time_toolrc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<>rLs <20>r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>4<00>(<00><><00><00><00>"O<>"O<>T<EFBFBD>4<EFBFBD>=<3D>#8<>"O<>"O<>"O<>"O<>"O<>"Or>u`数据包含分类字段但没有识别出缺失的分类分析工具。缺失工具列表<E8A1A8>has_missing_cat_toolrc3<00> <00>K<00>|]}|<01>vV<00><00> dSr<>r<>rLs <20>r<r<>z7test_tool_requirement_identification.<locals>.<genexpr>=rPr>u`数据包含数值字段但没有识别出缺失的统计分析工具。缺失工具列表<E8A1A8>has_missing_num_toolN)r+r<>r
<00>clear_missing_toolsr.<00>get_missing_toolsr<73>rJr<>r<>r<>r<>r<>r<>r<>r<>)r<>r<><00>empty_registryr0r1r2r4r6<00>
time_toolsrNr<><00> cat_toolsrQ<00> num_toolsrSrMs @r<<00>$test_tool_requirement_identificationrZ
s<00><><00>3<>2<>2<>2<>2<>2<>"<22>^<5E>^<5E>N<EFBFBD><19>k<EFBFBD>.<2E>)<29>)<29>G<EFBFBD> <0C><1F><1F>!<21>!<21>!<21><1D>)<29>)<29>,<2C>7<>7<>N<EFBFBD><1C>-<2D>-<2D>/<2F>/<2F>M<EFBFBD><17>O<>O<>,<2C>:N<>O<>O<>O<>O<>O<>L<EFBFBD><19>U<>U<> <0C>@T<>U<>U<>U<>U<>U<>O<EFBFBD><15>M<>M<> <0C>8L<38>M<>M<>M<>M<>M<>K<EFBFBD><14>
<EFBFBD>P<>P<>P<>
<EFBFBD> #<23>#Q<>#Q<>#Q<>#Q<>j<EFBFBD>#Q<>#Q<>#Q<> Q<> Q<><1D>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <17>
<EFBFBD><<3C><<3C><<3C> <09>"<22>"O<>"O<>"O<>"O<>Y<EFBFBD>"O<>"O<>"O<>O<>O<><1C>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <13>
<EFBFBD>d<>d<>d<> <09>"<22>"O<>"O<>"O<>"O<>Y<EFBFBD>"O<>"O<>"O<>O<>O<><1C>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><06>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
r>c<00>`<00>tD<00>]<5D>}|<00><00>}t|t<00><00>}|<02>sddtj<00><00>vst jt<00><00>rt jt<00><00>nddtj<00><00>vst j|<01><00>rt j|<01><00>nddtj<00><00>vst jt<00><00>rt jt<00><00>ndt j|<02><00>d<05>z}tt j |<03><00><00><00><00>d}d}t||<04><00>}|s<>dd tj<00><00>vst jt<00><00>rt jt<00><00>nd dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}d }t||<04><00>}|s<>dd tj<00><00>vst jt<00><00>rt jt<00><00>nd dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}d }t||<04><00>}|s<>dd tj<00><00>vst jt<00><00>rt jt<00><00>nd dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}d }t||<04><00>}|s<>dd tj<00><00>vst jt<00><00>rt jt<00><00>nd dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}d}t||<04><00>}|s<>dd tj<00><00>vst jt<00><00>rt jt<00><00>nd dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}|j }t|<04><00>}|s<>ddtj<00><00>vst jt<00><00>rt jt<00><00>nddtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}|j }t|<04><00>}|s<>ddtj<00><00>vst jt<00><00>rt jt<00><00>nddtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<04><00>t j|<05><00>d
<EFBFBD>z}tt j |<06><00><00><00><00>dx}}<05><07><>dS)u>验证所有工具类都正确实现了 AnalysisTool 接口。<E58FA3>5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}rirjr rkNr/z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}rprqrxryr<>r<>zIassert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.execute
})
}r<>zOassert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.is_applicable
})
})r,rir r<>r<>r<>r<>r<>r<>r<>rpr<>r<>r<>)rerjr<>r<>r<>r<>r<>s r<<00>"test_all_tools_implement_interfacer]Es<><00><00><1F>,<2C>,<2C>
<EFBFBD><19>z<EFBFBD>|<7C>|<7C><04> .<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>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D> %<25>$<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>+<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>+<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>*<2A>*<2A>'<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>-<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>-<2D> &<26>%<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>%<25>%<25>%<25>%<25>%<25>%<25>%<25>%<25>%<25>%<25>+<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>+<2B>+<2B>,<2C>,r>c <00><><00>t<00><00>}tD]!}|<01><00>}|<00>|<02><00><00>"|<00><00><00>}t |<03><00>}t t<00><00>}||k}|<06>s<>t jd|fd||f<02><00>dtj<00><00>vst j t<00><00>rt j
t<00><00>nddtj<00><00>vst j |<03><00>rt j
|<03><00>ndt j
|<04><00>dtj<00><00>vst j t<00><00>rt j
t<00><00>nddtj<00><00>vst j t<00><00>rt j
t<00><00>ndt j
|<05><00>d<06>z}dd|iz}tt j |<08><00><00><00><00>d x}x}}tD<00>]M}|<01><00>}|<00> |j<00><00>} | j}
|j} |
| k} | s<>t jd| fd
|
| f<02><00>d tj<00><00>vst j | <09><00>rt j
| <09><00>nd t j
|
<EFBFBD><00>d tj<00><00>vst j |<02><00>rt j
|<02><00>nd t j
| <0B><00>d <0A>z} dd| iz}tt j |<07><00><00><00><00>d x}
x} } t| t <00><00>} | <0C>sddtj<00><00>vst j t<00><00>rt j
t<00><00>ndd tj<00><00>vst j | <09><00>rt j
| <09><00>nd dtj<00><00>vst j t <00><00>rt j
t <00><00>ndt j
| <0C><00>d<13>z}tt j |<0E><00><00><00><00>d } <0C><02>Od S)u5测试 ToolRegistry 与所有工具的正确工作。r<E38082>)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}rO<00>registered_toolsr,)rlrmrrrsrtrvzassert %(py10)srwN)zF%(py2)s
{%(py2)s = %(py0)s.name
} == %(py6)s
{%(py6)s = %(py4)s.name
}<7D>retrieved_toolrj)rlrnrortzassert %(py8)srvr\rir rk)r
r,r-<00>
list_toolsrOr<>r<>r<>r<>r<>r<>r<>r<><00>get_toolr/rir )r/rerjr_r<>r<>r<>r<>r<>r`r<>r<>r<>r<>r<>s r<<00>!test_tool_registry_with_all_toolsrcZsk<00><00><1B>~<7E>~<7E>H<EFBFBD> <20> <20> <20>
<EFBFBD><19>z<EFBFBD>|<7C>|<7C><04><10><19><19>$<24><1F><1F><1F><1F> <20>*<2A>*<2A>,<2C>,<2C><14>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<>2<> <20>8<>8<>
<EFBFBD><19>z<EFBFBD>|<7C>|<7C><04>!<21>*<2A>*<2A>4<EFBFBD>9<EFBFBD>5<>5<><0E>/<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>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>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<>7<>7<>7<> 8<>8r>)r@rFrQr@)2<>__doc__<5F>builtinsr<73><00>_pytest.assertion.rewrite<74> assertion<6F>rewriter<65><00>pytest<73>pandasrX<00>numpyr<79><00>
hypothesisrrr5rr<00>typingrr<00>src.tools.baser r
<00>src.tools.query_toolsr r r r<00>src.tools.stats_toolsrrrr<00>
src.modelsrr<00> compositer=rPrdr,r6r<>r<>r;rFrZr]rcr<>r>r<<00><module>rss<><00><01>-<2D>-<2D><00><00><00><00><00><00><00><00><00><00><00><00><00> <0A> <0A> <0A> <0A><13><13><13><13><12><12><12><12>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40><1C><1C><1C><1C><1C><1C><1C><1C>5<>5<>5<>5<>5<>5<>5<>5<><02><02><02><02><02><02><02><02><02><02><02><02> <02><02><02><02><02><02><02><02><02><02><02><02> /<2F>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>
<04><1C>
<06>
<06><0E><1C>
<06><04><1C> <06> <06><0E><1C> <06><04><1C><1E><1E><1E><0E><1C><1E>D<1E><16><15><16><1B><16><16><16> <02> <09><07><15>/<2F>"<22>/<2F>)<29>,<2C>,<2C>-<2D>-<2D>-<2D> <09><18>r<EFBFBD><1A><1A><1A>\t<01>\t<01><1B><1A>.<2E>-<2D>\t<01>@<07><15><1E>r<EFBFBD><EFBFBD>y<EFBFBD>)<29>)<29><19><19>3<EFBFBD><13>5<>5<>5<><02><02><02>
<EFBFBD><18>r<EFBFBD>D<EFBFBD>)<29>)<29>)<29>K
<EFBFBD>K
<EFBFBD>*<2A>)<29> <02><02>
K
<EFBFBD>^<07><15>)<29>)<29>+<2B>+<2B>,<2C>,<2C>,<2C> <09><18>r<EFBFBD><1A><1A><1A>H
<EFBFBD>H
<EFBFBD><1B><1A>-<2D>,<2C>H
<EFBFBD>X<07><15><1E>r<EFBFBD><EFBFBD>y<EFBFBD>)<29>)<29>&<26>&<26>(<28>(<28><02><02><02>
<EFBFBD><18>r<EFBFBD><1A><1A><1A>U<0E>U<0E><1B><1A> <02><02>
U<0E>r<07><15>)<29>)<29>+<2B>+<2B>,<2C>,<2C>,<2C> <09><18>r<EFBFBD><1A><1A><1A>5
<EFBFBD>5
<EFBFBD><1B><1A>-<2D>,<2C>5
<EFBFBD>r,<2C>,<2C>,<2C>*8<>8<>8<>8<>8r>