<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="2" tests="49" time="1.170" timestamp="2026-04-24T20:34:18.110784+08:00" hostname="HenryLin-SFP7"><testcase classname="tests.src.core.math.test_zscore.TestStandardizationMath" name="test_normal_zscore_broadcasting" time="0.007" /><testcase classname="tests.src.core.math.test_zscore.TestStandardizationMath" name="test_ieee754_division_by_zero_intercept" time="0.001" /><testcase classname="tests.src.core.math.test_zscore.TestStandardizationMath" name="test_mad_clip_functionality" time="0.001" /><testcase classname="tests.src.core.sql.test_aligner.TestDuckDBTimeAligner" name="test_output_contains_math_anchor" time="0.001" /><testcase classname="tests.src.core.sql.test_aligner.TestDuckDBTimeAligner" name="test_output_contains_bigint_cast" time="0.001" /><testcase classname="tests.src.core.sql.test_aligner.TestDuckDBTimeAligner" name="test_output_bans_stateful_functions" time="0.001" /><testcase classname="tests.src.core.sql.test_aligner.TestDuckDBTimeAligner" name="test_input_col_interpolated" time="0.001" /><testcase classname="tests.src.core.storage.test_contract" name="test_sink_parquet_injects_strict_params" time="0.006" /><testcase classname="tests.src.core.stream.test_engine" name="test_stream_engine_normal_flow" time="0.004" /><testcase classname="tests.src.core.stream.test_engine" name="test_stream_engine_memory_limit_triggered" time="0.003" /><testcase classname="tests.src.core.test_config_loader" name="test_load_valid_config" time="0.015" /><testcase classname="tests.src.core.test_config_loader" name="test_load_missing_file" time="0.004" /><testcase classname="tests.src.core.test_config_loader" name="test_load_empty_whitelist_triggered" time="0.008" /><testcase classname="tests.src.core.test_config_loader" name="test_load_invalid_spearman_mode" time="0.008" /><testcase classname="tests.src.core.test_config_loader" name="test_load_missing_required_field" time="0.007" /><testcase classname="tests.src.core.test_constants.TestPhysicalConstants" name="test_time_alignment_constants" time="0.003" /><testcase classname="tests.src.core.test_constants.TestPhysicalConstants" name="test_storage_contract_constants" time="0.001" /><testcase classname="tests.src.core.test_constants.TestPhysicalConstants" name="test_label_math_bounds" time="0.001" /><testcase classname="tests.src.core.test_golden_precision" name="test_ols_ewm_golden_precision" time="0.001"><skipped type="pytest.skip" message="等待 S3 OLS/EWM 算法实现及 .npy 基线文件生成后解除封印">C:\Users\huaru\project\pers_website\pers-website-fund-selection-system\tests\src\core\test_golden_precision.py:10: 等待 S3 OLS/EWM 算法实现及 .npy 基线文件生成后解除封印</skipped></testcase><testcase classname="tests.src.core.test_schema_symmetry" name="test_s2_s3_s4_schema_symmetry" time="0.001"><skipped type="pytest.skip" message="等待 S2/S3/S4 业务骨架就绪后解除封印">C:\Users\huaru\project\pers_website\pers-website-fund-selection-system\tests\src\core\test_schema_symmetry.py:10: 等待 S2/S3/S4 业务骨架就绪后解除封印</skipped></testcase><testcase classname="tests.src.core.test_telemetry.TestProfileStep" name="test_preserves_return_value" time="0.001" /><testcase classname="tests.src.core.test_telemetry.TestProfileStep" name="test_json_output_to_stderr_only" time="0.002" /><testcase classname="tests.src.core.test_telemetry.TestProfileStep" name="test_json_structure_completeness" time="0.002" /><testcase classname="tests.src.core.test_telemetry.TestProfileStep" name="test_duration_sec_non_negative" time="0.001" /><testcase classname="tests.src.core.test_telemetry.TestProfileStep" name="test_peak_rss_mb_equals_max_of_start_and_end" time="0.001" /><testcase classname="tests.src.pipelines.s2.test_step_1_1.TestTranscodeCsvToParquet" name="test_polars_forces_utf8_and_date" time="0.022" /><testcase classname="tests.src.pipelines.s2.test_step_1_1.TestTranscodeCsvToParquet" name="test_net_value_forces_float64" time="0.010" /><testcase classname="tests.src.pipelines.s2.test_step_1_1.TestExecuteStep1_1" name="test_d1_whitelist_blocks_invalid_funds" time="0.044" /><testcase classname="tests.src.pipelines.s2.test_step_1_1.TestExecuteStep1_1" name="test_math_aligned_monday_and_max_value" time="0.036" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutBasic" name="test_no_gap_single_segment" time="0.010" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutBasic" name="test_long_gap_triggers_cut" time="0.009" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutBoundary" name="test_gap_exactly_5_no_cut" time="0.011" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutBoundary" name="test_gap_exactly_6_cuts" time="0.009" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutMultiFund" name="test_multiple_funds_independent_segments" time="0.011" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutMultiFund" name="test_single_row_fund" time="0.010" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutSchemaAssertion" name="test_invalid_column_name_raises" time="0.007" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutSchemaAssertion" name="test_invalid_column_type_raises" time="0.008" /><testcase classname="tests.src.pipelines.s2.test_step_1_2.TestSegmentCutDataIntegrity" name="test_zero_rows_dropped" time="0.007" /><testcase classname="tests.src.pipelines.s2.test_step_1_3.TestSegmentImputationBasic" name="test_no_missing_weeks_first_return_is_null" time="0.009" /><testcase classname="tests.src.pipelines.s2.test_step_1_3.TestSegmentImputationBasic" name="test_single_missing_week_filled_and_nullified" time="0.006" /><testcase classname="tests.src.pipelines.s2.test_step_1_3.TestSegmentImputationDefense" name="test_first_row_null_raises_error" time="0.005" /><testcase classname="tests.src.pipelines.s2.test_step_1_3.TestSegmentImputationDefense" name="test_phantom_zero_return_physically_blocked" time="0.005" /><testcase classname="tests.src.pipelines.s2.test_step_1_3.TestSegmentImputationIsolation" name="test_multi_segment_no_cross_contamination" time="0.006" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestYearlyPartitionWriterBasic" name="test_single_year_writes_one_file" time="0.013" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestYearlyPartitionWriterBasic" name="test_multi_year_creates_correct_partitions" time="0.015" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestYearlyPartitionWriterBasic" name="test_partition_preserves_all_rows" time="0.014" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestYearlyPartitionWriterBasic" name="test_output_schema_matches_contract" time="0.010" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestSchemaSymmetryGuard" name="test_missing_column_raises" time="0.007" /><testcase classname="tests.src.pipelines.s2.test_step_1_4.TestSchemaSymmetryGuard" name="test_extra_column_raises" time="0.008" /></testsuite></testsuites>