मैं बीम के साथ परीक्षण की खोज कर रहा हूं और एक अजीब समस्या का सामना करना पड़ा।

मेरा ड्राइवर प्रोग्राम अपेक्षा के अनुरूप काम करता है, लेकिन इसका परीक्षण इस तरह की त्रुटि के साथ विफल हो रहा है:

Expected: iterable with items [<Row: 
project_id:count
count_in:2
count_out:0
type:null
window_max_ts:86399999
>] in any order
     but: not matched: <Row: 
project_id:p1
count_in:2
count_out:0
type:count
window_max_ts:86399999
>

और यहाँ मेरा PAssert कोड है:

PAssert
            .that(output)
            .inWindow(window)
            .containsInAnyOrder(
                Row
                    .withSchema(OUTPUT_SCHEMA)
                    .withFieldValue("type", "count")
                    .withFieldValue("count_in", 2L)
                    .withFieldValue("count_out", 0L)
                    .withFieldValue(AddWindowTimestamp.TIMESTAMP_FIELD, window.maxTimestamp().getMillis())
                    .build()
            );

मेरी पाइपलाइन के अंतिम चरण में, मैं विचाराधीन तत्व को लॉग करता हूं।

[direct-runner-worker] DEBUG co.botanalytics.data.processing.beam.transforms.Log - Window: [maxTimestamp=1970-01-01T23:59:59.999Z], Pane: [PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}], Element: Row: 
project_id:p1
count_in:2
count_out:0
type:count
window_max_ts:86399999

यह अपेक्षित परिणाम है।

जब मैंने परीक्षण को डीबग किया, तो समस्या बीम जावा एसडीके से कोडरयूटिल्स तक उबाल गई।

CoderUtils एन्कोड और डीकोड के बाद, यह एक पूरी तरह से अलग अपेक्षित पंक्ति उत्पन्न करता है। इसके सभी क्षेत्र खराब हो गए हैं, और परिणामस्वरूप, PAssert विफल हो जाता है।

मैं सोच रहा हूं कि क्या इस समस्या का कोई समाधान है। कोई सुझाव स्वागत से अधिक है।

अग्रिम में धन्यवाद!

OUTPUT_SCHEMA परिभाषा:

private static final transient Schema SCHEMA = Schema
            .builder()
            .addStringField("project_id")
            .addNullableField("type", Schema.FieldType.STRING)
            .addInt64Field("count_in")
            .addInt64Field("count_out")
            .build();
1
Deniz Acay 15 अक्टूबर 2021, 14:35
सीम समस्या परीक्षण किए गए आउटपुट में नहीं है बल्कि आप परीक्षण फ़ील्ड को कैसे परिभाषित करते हैं। क्या आप कृपया इस बारे में अधिक विवरण प्रदान कर सकते हैं कि आप output और अपने OUTPUT_SCHEMA को कैसे परिभाषित करते हैं?
 – 
ewertonvsilva
18 अक्टूबर 2021, 10:50
मैंने स्कीमा परिभाषा जोड़ी। यदि ऐसा है, तो क्या सामान्य रूप से चलने पर भी यह विफल नहीं होना चाहिए? PAssert का उपयोग करते समय यह विफल हो जाता है।
 – 
Deniz Acay
18 अक्टूबर 2021, 19:21
कोड अपेक्षा के अनुरूप काम कर सकता है और परीक्षण विफल हो जाता है। मेरा मानना ​​है कि PAssert पर गलत कॉन्फ़िगरेशन के कारण ऐसा हो रहा है। कृपया निम्नलिखित का परीक्षण करें: 1- परीक्षण पंक्ति परिभाषा में प्रोजेक्ट टैग जोड़ें: .withFieldValue("project_id", "p1") और इसका परीक्षण करें, यह पार किए गए मापदंडों की समस्या को हल कर सकता है। 2- त्रुटि Expected: iterable with items को हल किया जा सकता है यदि आप .that(output) को .that(output.toArray()) के लिए बदलते हैं। यहs expecting an array but just receiving a single पंक्ति'। कृपया मुझे बताएं कि क्या आपको सफलता मिली है, तो मैं एक उत्तर पोस्ट कर सकता हूं। मुझे उम्मीद है यह मदद करेगा! :)
 – 
ewertonvsilva
19 अक्टूबर 2021, 10:46
नमस्ते @DenizAcay। कोई अपडेट्स?
 – 
Wytrzymały Wiktor
21 अक्टूबर 2021, 13:52
मैंने सोचा कि मैंने यह कोशिश की लेकिन किसी तरह मैं चूक गया। इंगित करने के लिए धन्यवाद! पीसीओलेक्शन में toArray विधि नहीं है इसलिए इसके बजाय मैंने एक पंक्ति सरणी के अंदर containsInAnyOrder को परिणाम प्रदान किए।
 – 
Deniz Acay
21 अक्टूबर 2021, 15:14

1 उत्तर

सबसे बढ़िया उत्तर

कोड अपेक्षा के अनुरूप काम कर सकता है और परीक्षण विफल हो जाता है। मेरा मानना ​​है कि PAssert परिभाषा में त्रुटि के कारण ऐसा हो रहा है।

  • परीक्षण पंक्ति परिभाषा .withFieldValue("project_id", "p1") में प्रोजेक्ट टैग जोड़ें, यह पार किए गए पैरामीटर की समस्या को हल कर सकता है।

  • त्रुटि Expected: iterable with items [<Row: ... >] in any order but: not matched: के लिए कृपया output वैरिएबल को केवल एक Row के बजाय Array of Rows के रूप में प्रदान करें। यह एक array की अपेक्षा कर रहा है, लेकिन केवल एक Row प्राप्त कर रहा है।

आपका अंतिम कोड कुछ इस तरह होगा:

// just an example to convert to array, choose any suitable way for you
    Foo[] array = new Foo[output.size()];
    output.toArray(array);

        PAssert
                    .that(output)
                    .inWindow(window)
                    .containsInAnyOrder(
                        Row
                            .withSchema(OUTPUT_SCHEMA)
                            .withFieldValue("project_id", "p1")
                            .withFieldValue("type", "count")
                            .withFieldValue("count_in", 2L)
                            .withFieldValue("count_out", 0L)
                            .withFieldValue(AddWindowTimestamp.TIMESTAMP_FIELD, window.maxTimestamp().getMillis())
                            .build()
                    );
1
ewertonvsilva 21 अक्टूबर 2021, 15:30
मेरे लिए, एक सरणी के अंदर containsInAnyOrder को पास की गई पंक्ति को लपेटने से वास्तव में सही परिणाम प्राप्त हुआ। लेकिन फिर भी, आपने मुझे सही दिशा में इंगित किया और यह काम कर गया। मैं इस जवाब को स्वीकार कर रहा हूं।
 – 
Deniz Acay
22 अक्टूबर 2021, 12:51
मैं सराहना करता हूं। यदि आप चाहें तो किसी भी सुझाए गए सुधार के साथ आप मेरे उत्तर को संपादित कर सकते हैं।
 – 
ewertonvsilva
22 अक्टूबर 2021, 13:03
मुझे लगता है कि यह किसी के लिए भी मददगार होगा जो इससे टकरा सकता है :)
 – 
Deniz Acay
22 अक्टूबर 2021, 17:21