क्यों नहीं छापता! जंग इकाई परीक्षणों में काम करते हैं?


285

मैंने निम्नलिखित विधि और इकाई परीक्षण लागू किया है:

use std::fs::File;
use std::path::Path;
use std::io::prelude::*;

fn read_file(path: &Path) {
    let mut file = File::open(path).unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    println!("{}", contents);
}

#[test]
fn test_read_file() {
    let path = &Path::new("/etc/hosts");
    println!("{:?}", path);
    read_file(path);
}

मैं इकाई परीक्षण इस तरह से चलाता हूं:

rustc --test app.rs; ./app

मैं भी इसके साथ दौड़ सकता था

cargo test

मुझे एक संदेश वापस मिला जिसमें कहा गया है कि परीक्षा पास हो गई है लेकिन println!स्क्रीन पर कभी प्रदर्शित नहीं होती है। क्यों नहीं?

जवाबों:


327

ऐसा इसलिए होता है क्योंकि रस्ट टेस्ट प्रोग्राम सफल परीक्षणों के स्टडआउट को छिपाते हैं ताकि टेस्ट आउटपुट चुस्त हो। आप --nocaptureपरीक्षण बाइनरी या के लिए विकल्प पास करके इस व्यवहार को अक्षम कर सकते हैं cargo test:

#[test]
fn test() {
    println!("Hidden output")
}

परीक्षण के लिए:

% rustc --test main.rs; ./main

running 1 test
test test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

% ./main --nocapture

running 1 test
Hidden output
test test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

% cargo test -- --nocapture

running 1 test
Hidden output
test test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

यदि परीक्षण विफल होते हैं, हालांकि, यह विकल्प मौजूद है या नहीं, इसकी परवाह किए बिना उनका स्टडआउट मुद्रित किया जाएगा।


10
आपने इस --nocaptureविकल्प को पारित करने का उल्लेख किया है cargo test, लेकिन कार्गो इस ध्वज को मेरे लिए नहीं पहचानता (नवीनतम रात में रुस्तूप से उपयोग करके) पहचानता है। क्या आप सुनिश्चित हैं कि यह काम करना चाहिए?
जिम गैरिसन

42
@JimGarrison, वास्तव में, उस पर एक मुद्दा है। इस बीच आप उपयोग कर सकते हैं cargo test -- --nocapture, यह काम करना चाहिए।
व्लादिमीर मतावेव

4
धन्यवाद! इस सवाल से असंबंधित, लेकिन इससे मुझे यह पता लगाने में भी मदद मिली कि कैसे cargo test [--] --benchकाम करना है!
जिम गैरिसन

6
@Nashenas, विकल्प कहा जाता है nocapture, नहीं no-capture
व्लादिमीर मतावेव

1
क्या किसी को पता चला है कि विंडोज़ में विजुअल स्टूडियो कोड में डिबगिंग करते समय कैसे प्रिंट करें? निम्न कार्य पॉपअप शेल पर प्रिंट नहीं होता है: "कार्गो टेस्ट - नहीं-रन - --nocapture" डीबगर। नो-रन तर्क के उपयोग पर ध्यान दें, हालांकि यह किसी भी तरह से फर्क नहीं करता है। मैं देख रहा हूं कि "1 परीक्षण चल रहा है"। अजीब टूलींग।
डेविड

75

टी एल; डॉ

$ cargo test -- --nocapture

निम्नलिखित कोड के साथ:

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum PieceShape {
    King, Queen, Rook, Bishop, Knight, Pawn
}

fn main() {
    println!("Hello, world!");
}

#[test]
fn demo_debug_format() {
    let q = PieceShape::Queen;
    let p = PieceShape::Pawn;
    let k = PieceShape::King;
    println!("q={:?} p={:?} k={:?}", q, p, k);
}

फिर निम्नलिखित चलाएं:

 $ cargo test -- --nocapture

और आपको देखना चाहिए

Running target/debug/chess-5d475d8baa0176e4

running 1 test
q=Queen p=Pawn k=King
test demo_debug_format ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

cargo test -- --no-captureअब काम नहीं करता है। मुझे निम्नलिखित त्रुटि मिलती है:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
नैशेनस

मुझे आश्चर्य है कि अगर यह मुद्दा github.com/rust-lang/cargo/issues/1377 समस्या है?
Superlogical

5
जैसा कि पिछली टिप्पणियों में बताया गया है --nocapture, विकल्प है , नहीं --no-capture। हालाँकि, यह एक पूरी तरह से स्पष्ट गलती है कि हम जो भी कमांड लाइन कन्वेंशन करते हैं, वह पूरी होती है। मैंने इस विकल्प का उपयोग बिल्कुल वैसा ही किया जैसा कि इस उत्तर में जंग 1.1 (कार्गो 0.2.0) में किया गया है और यह बिल्कुल विज्ञापन के रूप में काम करता है।
ग्लेन मैकलिस्टर

10

println!()परीक्षण परिणामों के लिए प्रिंट आउट को शामिल करने और रंगों को रखने के लिए, colorऔर nocaptureझंडे का उपयोग करें cargo test

$ cargo test -- --color always --nocapture

(कार्गो संस्करण: 0.13.0 रात्रिकालीन)


6

परीक्षण करते समय, मानक आउटपुट प्रदर्शित नहीं किया जाता है। परीक्षण लेकिन के लिए पाठ संदेश का प्रयोग न करें assert!, assert_eq!और fail!बजाय। रस्ट की इकाई परीक्षण प्रणाली इन्हें समझ सकती है लेकिन पाठ संदेश नहीं।

आपके द्वारा लिखी गई परीक्षा पास हो जाएगी भले ही कुछ गलत हो जाए। आइए देखें क्यों:

read_to_endका हस्ताक्षर है fn read_to_end(&mut self) -> IoResult<Vec<u8>>

यह IoResultसफलता या त्रुटि को इंगित करने के लिए एक रिटर्न देता है । यह सिर्फ एक प्रकार का डीईएफ़ है, Resultजिसकी त्रुटि मान a है IoError। यह तय करना आपके लिए है कि किसी त्रुटि को कैसे नियंत्रित किया जाना चाहिए। इस मामले में, हम जो बुला द्वारा किया जाता है विफल कार्य, चाहते हैं unwrapपरResult

यह काम करेगा:

let contents = File::open(&Path::new("message.txt"))
    .read_to_end()
    .unwrap();

unwrap हालांकि अति प्रयोग नहीं किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.