প্রিন্টলন কেন হয় না! মরিচা ইউনিট পরীক্ষায় কাজ?


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, তবে কার্গো আমার জন্য এই পতাকাটি চিনতে পারে না (rustup.sh থেকে সর্বশেষতম রাত্রি ব্যবহার করে)। আপনি কি নিশ্চিত যে এটি কাজ করা উচিত?
জিম গ্যারিসন

42
@ জিমগারিসন, সত্যই, এটি নিয়ে একটি সমস্যা রয়েছে। ইতিমধ্যে আপনি ব্যবহার করতে পারেন cargo test -- --nocapture, এটি কাজ করা উচিত।
ভ্লাদিমির মাত্তেভ

4
ধন্যবাদ! এই প্রশ্নের সাথে সম্পর্কিত নয়, তবে এটি আমাকে কীভাবে কীভাবে cargo test [--] --benchকাজ করতে হয় তা নির্ধারণ করতেও সহায়তা করেছিল !
জিম গ্যারিসন

6
@ নাশেনাস, অপশনটি বলা হয় nocapture, না no-capture
ভ্লাদিমির মাত্তেভ

1
উইন্ডোতে ভিজ্যুয়াল স্টুডিও কোডটি ডিবাগ করার সময় কী কী মুদ্রণ করবেন তা কি কেউ আবিষ্কার করেছেন? নিম্নলিখিত টাস্কটি পপআপ শেলটিতে মুদ্রণ করে না: "কার্গো পরীক্ষা - না-চালানো - --নোক্যাচার" ডিবাগার। নন-রান আর্গুমেন্টের ব্যবহারটি নোট করুন যদিও এটি কোনওভাবেই কোনও পার্থক্য বলে মনে হচ্ছে না। আমি যা দেখছি তা হ'ল "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 সমস্যা?
সুপারলজিকাল

5
পূর্ববর্তী মন্তব্যে যেমন উল্লেখ করা হয়েছে, বিকল্পটি নয় --nocapture, নয় --no-capture। যাইহোক, বেশিরভাগ কমান্ড লাইন কনভেনশন দেওয়া যেগুলি আমাদের সামনে আসতে প্রবণতা রয়েছে এটি করা সম্পূর্ণ পরিষ্কার ভুল। আমি জাস্ট ১.১ (কার্গো ০.০.০) এ উত্তরটিতে বর্ণিত ঠিক এই বিকল্পটি ব্যবহার করেছি এবং এটি বিজ্ঞাপন হিসাবে ঠিক কাজ করেছে।
গ্লেন ম্যাকএলিস্টার

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যার ত্রুটির মান হ'ল একটি IoError। কোনও ত্রুটি কীভাবে পরিচালনা করা উচিত তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে। এই ক্ষেত্রে, আমরা যা কল করে সম্পন্ন করা হয় ব্যর্থ কাজের চান unwrapউপরResult

এটি কাজ করবে:

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

unwrap যদিও অতিরিক্ত ব্যবহার করা উচিত নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.