Shanraq.org Shanraq.org
Алғашқы автоматты тест
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 16-сабақ (барлығы 20)

Алғашқы автоматты тест

Сабақ 16. Есептеу нәтижесін күтілетін мәнмен автоматты түрде салыстыру.

Мәтін ИИ көмегімен аударылды.

Алдын ала: 1–15-сабақтар, әсіресе функциялар мен жиымдар. Әзірге сыртқы кітапханасыз сандық есептеуді тексереміз.

Тұрмыстық бейне және тірек карта

Жіберер алдында сәлемдемені өлшедіңіз делік. «Салмағы 5 кг болуы керек» деп жазып қойсаңыз, ертең сол тексеруді қайталай аласыз. Автоматты тест те код үшін кіріс пен күтілетін нәтижені сақтап, шыққан нәтижемен салыстырады. Бейненің шегі бар: бір сәлемдеменің салмағы барлық сәлемдеме дұрыс дегенді білдірмейді; бір өткен тест функцияның барлық кіріске дұрыс екенін дәлелдемейді.

Кіріс → функция → нақты нәтиже ↔ күтілетін нәтиже → тест хабарламасы. Кодқа қарамай тұрып осы тізбекті есте сақтап айтып көріңіз.

Бағдарлама мен тестті іске қосу

Алдымен екі жаңа жазылымды түсінейік. #[test] — аргументсіз функцияның алдындағы атрибут, яғни белгі. # белгіні бастайды, төртбұрыш жақшаның ішінде оның атауы тұр, ал test «келесі функцияны тест ретінде іске қос» дегенді білдіреді. assert_eq!(нақты, күтілетін) бірінші, код есептеген мәнді екінші, өзіміз болжаған мәнмен салыстырады. ! оның println! сияқты макрос екенін көрсетеді. Мәндер тең болса, тексеру өтеді; тең болмаса, екі мән көрсетіліп, тест өтпейді.

6-сабақтағы organizer жобасын ашыңыз. Cargo.toml бар бумада бұрынғы src/main.rs мазмұнын бөлек сақтап, файлды төмендегі кодпен толық ауыстырыңыз. Басқа файлдар мен тәуелділіктер өзгермейді. cargo run бағдарламаның main функциясын құрастырып іске қосады; cargo test #[test] белгісі бар функцияларды құрастырып іске қосады. Екі пәрменді де жоба бумасының терминалында орындаңыз. Төмендегі нәтиже — Cargo хабарлары емес, cargo run шығарған мәтін. Әуелі болжаңыз.

fn remaining(total: u32, done: u32) -> u32 {
    total - done
}

fn main() {
    println!("Қалғаны: {}", remaining(7, 2));
}

#[test]
fn subtracts_done_tasks() {
    assert_eq!(remaining(7, 2), 5);
}
Қалғаны: 5

Алғашқы екі функция 14-сабақта түсіндірілген. Белгісі бар тест функциясын main өзі шақырмайды. Функциялар бір файлда болғандықтан, тест remaining функциясын шақыра алады. Тесттерді модульге топтастыруды 44-сабақтағы модульдерден кейін үйренеміз.

assert_eq! теңдік дұрыс болғанда ештеңе басып шығармайды. cargo test нәтижесінде 1 passed; 0 failed болуы тиіс; басқа жолдар Cargo нұсқасына қарай өзгеруі мүмкін. Тест қатені көрсетеді, бірақ функцияны өзі түзетпейді.

Әдейі бұзып, қалпына келтіріңіз

Күтілетін 5 санын 6 етіп өзгертіп, cargo test орындаңыз: тексеру өтпеуі керек. 5 санын қайтарыңыз. Енді total - done орнына total + done жазып, қайта тексеріңіз; содан соң азайтуды қалпына келтіріңіз. Егер тексеру бәрібір өтсе, файлды сақтағаныңызды және пәрменді жоба бумасында орындағаныңызды қараңыз. 14-сабақтағы алдын ала шарт сақталады: done <= total. Бұдан үлкен done осы функция үшін жарамсыз кіріс. Result тақырыбынан кейін қате деректі ашық өңдейміз.

Еске түсіру

Қай пәрмен main функциясын, ал қайсысы #[test] функцияларын іске қосады? Бір сәтті тест барлық u32 мәндеріне кепіл бола ма? Жауап: cargo run, кейін cargo test; жоқ.

Тапсырма

Міндетті. 14-сабақтағы ережемен is_short(minutes: u32) -> bool жазыңыз: 1–15 минут қоса алғанда. Үш тест қосыңыз: 0 → false, 15 → true, 16 → false. Алдымен нәтижелерді болжаңыз, сосын cargo test және cargo run орындаңыз. 15 үшін бағдарлама Қысқа: true шығаруы керек. Бір күтілетін мәнді әдейі қате жазып, тесттің өтпегенін көріңіз де, дұрыстаңыз. Шарт түсініксіз болса, 11-сабаққа оралыңыз.

Ишара

main функциясынан кейін аргументсіз үш бөлек функция жазыңыз; әрқайсысының алдында #[test] болсын. is_short(...) нәтижесін true не false мәнімен салыстырыңыз.

Өз талпынысыңыздан кейінгі үлгі

fn is_short(minutes: u32) -> bool {
    minutes > 0 && minutes <= 15
}

fn main() {
    println!("Қысқа: {}", is_short(15));
}

#[test]
fn zero_is_not_a_task() {
    assert_eq!(is_short(0), false);
}

#[test]
fn fifteen_is_short() {
    assert_eq!(is_short(15), true);
}

#[test]
fn sixteen_is_long() {
    assert_eq!(is_short(16), false);
}
Қысқа: true

Үш шекара маңызды: тек 15 санын тексеру 0 не 16 санының қате қабылданғанын байқамас еді. Rust тесттері туралы ресми тарау.

Алдыңғы сабақ · Мазмұны

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.