ตั้งค่าการแจ้งเตือนอัตโนมัติสีแดง / เขียวสำหรับการทดสอบอย่างต่อเนื่องและ TDD?


1

หมายเหตุ: โพสต์นี้ถูกโพสต์ภายใต้สแต็คโอเวอร์โฟลว์และมีคน downvote อย่างสมเหตุสมผลเนื่องจากเป็น OS X เฉพาะจริงๆ ดังนั้นฉันจึงโพสต์ใหม่ตรงนี้เนื่องจากเป็นประโยชน์โดยทั่วไป

ฉันชอบที่จะพัฒนา Test Driven Development (TDD) ดังนั้นฉันต้องการวิธีที่ชุดทดสอบของฉันจะทำงานเมื่อใดก็ตามที่ฉันเปลี่ยนไฟล์ต้นฉบับหรือไฟล์ทดสอบ

นอกจากนี้ฉันต้องการผลลัพธ์ของการทดสอบที่จะแสดงในหน้าต่างสไตล์ "Growl" แบบชั่วคราวที่มุมของหน้าจอของฉันแสดงไอคอนสีเขียวหากการทดสอบทั้งหมดผ่านและไอคอนสีแดงหากการทดสอบอย่างน้อยหนึ่งครั้งล้มเหลว

ฉันรู้ว่ามีกลไกดังกล่าวสำหรับ node.js ในมอคค่าและสำหรับสภาพแวดล้อมที่มีรูบี้ทับทิมยาม - rspec แต่ฉันจะสร้างสภาพแวดล้อมการทดสอบ [กรอกข้อมูลในช่องว่าง] ภายใต้ OS X ได้อย่างไร


แม้จะเฉพาะเจาะจงกับ OS X หากเกี่ยวกับการเขียนโปรแกรมฉันคิดว่า SO น่าจะยังคงเป็นสถานที่ที่ดี หนึ่ง DV สุ่มไม่ควรกีดกันให้คุณถามที่นั่น เนื่องจากเป็น TDD SQAจึงเป็นอีกเว็บไซต์หนึ่งที่ต้องพิจารณาถาม
kenorb

คำตอบ:


1

ภายใต้ OS X คุณสามารถสร้างโซลูชันอย่างง่ายโดยใช้ยูทิลิตีที่ไม่ได้ติดตั้งสองชั้น: fswatchและterminal-notifierสคริปต์ทุบตีง่ายๆสามตัว นี่คือวิธี:

ดาวน์โหลด fswatch และเทอร์มินัลแจ้ง

$ brew install fswatch
$ brew install terminal-notifier

ตั้งค่าไดเรกทอรีโครงการ

ไดเรกทอรีโครงการของฉันมีเค้าโครงดังนี้ แต่แน่นอนว่าคุณสามารถเลือกกลยุทธ์ทางเลือกได้:

$PROJECT_ROOT/
  logs/
  lib/
  scripts/
    icons/
  tests/

สร้างสคริปต์ทุบตีสาม

ไฟล์: สคริปต์ / run-tests

นี่เป็นสคริปต์ง่ายๆที่เรียกใช้การทดสอบเฟรมเวิร์กของคุณ ในกรณีนี้เรากำลังเรียกใช้ python unittestแต่คุณสามารถปรับแต่งให้เหมาะกับความต้องการของคุณ:

#!/bin/bash
# Run unit tests over the test directory

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )

PYTHON=python                                                           # customize for your needs
export PYTHONPATH="$PROJECT_ROOT/lib"                                   # customize for your needs
${PYTHON} -m unittest discover --start-directory "$PROJECT_ROOT/tests"  # customize for your needs

ไฟล์: สคริปต์ / คำราม - การทดสอบ

สคริปต์นี้เรียกใช้run-testsและบันทึก stdout และ stderr ในล็อกไฟล์ run-testsจากนั้นจะแสดงข้อความคำรามเหมือนขึ้นอยู่กับผลของ คุณต้องปรับแต่งสคริปต์นี้เพื่อแยกผลลัพธ์run-testsและตัดสินใจว่าจะแสดงไอคอนสีแดงหรือสีเขียว unittestตัวอย่างที่แสดงที่นี่จะแยกวิเคราะห์การส่งออกของงูหลามของ หากคุณใช้ระบบอื่นคุณจะต้องทำการเปลี่ยนแปลงที่เหมาะสมกับสคริปต์

#!/bin/bash
# Run tests and display results in a "growl"-like window.

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )
TEST_RUNNER="$PROJECT_ROOT/scripts/run-tests"
STDOUT_LOG="$PROJECT_ROOT/logs/unittest_stdout.log"
STDERR_LOG="$PROJECT_ROOT/logs/unittest_stderr.log"

# Run the tests, copy stdout and stderr to STDOUT_LOG and STDERR_LOG
# respectively
$TEST_RUNNER > >(tee "$STDOUT_LOG") 2> >(tee "$STDERR_LOG" >&2)

# Capture the exit status of TEST_RUNNER.  We will use this for the
# red / green distinction in our Growl display.
TEST_STATUS=$?

# The following lines are specific to the Python `unittest` output,
# and aren't required for the red / green display.  We extract a few
# extra bits of info so the Growl window can display something like:
#     Ran 452 tests in 8.300s
#     FAILED (failures=3)

# extract "Ran n tests in n.nnns"
TEST_SUMMARY=`tail -3 "$STDERR_LOG" | head -1`

# extract "OK" or "FAILED (failures=n)"
TEST_RESULT=`tail -1 "$STDERR_LOG"`

# Compose the two strings to make the entire message
GROWL_MESSAGE="$TEST_SUMMARY
$TEST_RESULT"

# Pick a sound and an icon based on TEST_STATUS
if [ $TEST_STATUS -eq 0 ] ; then
    GROWL_SOUND="Submarine"
    GROWL_ICON="$PROJECT_ROOT/scripts/icons/GreenBead.png"
else
    GROWL_SOUND="Purr"
    GROWL_ICON="$PROJECT_ROOT/scripts/icons/RedBead.png"
fi

# Now display the results in a Growl-like window
echo "$GROWL_MESSAGE" | terminal-notifier -sound $GROWL_SOUND -contentImage $GROWL_ICON

ไฟล์: สคริปต์ / การทำงานอัตโนมัติทดสอบ

สคริปต์นี้จะเรียกใช้growl-testsครั้งเดียวเมื่อเริ่มต้นและอีกครั้งเมื่อใดก็ตามที่มีการแก้ไขไฟล์บางไฟล์ ภายใต้สถานการณ์ส่วนใหญ่ไฟล์นี้อาจใช้คำต่อคำโดยไม่มีการดัดแปลงใด ๆ

#!/bin/bash
# Run tests automatically whenever files change in the PROJECT_ROOT

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )
TEST_RUNNER="$PROJECT_ROOT/scripts/growl-tests"

# run tests once at startup
"$TEST_RUNNER"

# Run tests whenever anything under PROJECT_ROOT changes
# Note that we explicitly exclude the log files, since they get
# written as a result of running the tests.  If we didn't exclude
# them, fswatch would retrigger continuously.
fswatch --one-per-batch "$PROJECT_ROOT" --exclude logs | xargs -n1 -I{} "$TEST_RUNNER"

เพิ่มไอคอนเพื่อทำให้มันสวย

วางไอคอนเหล่านี้ในไดเรกทอรีสคริปต์ / ไอคอนของคุณ สิ่งเหล่านี้จะถูกใช้เป็นไอคอนสีแดงและสีเขียวในหน้าต่างคำราม

สคริปต์ / ไอคอน / GreenBead.png:

GreenBead.png

สคริปต์ / ไอคอน / RedBead.png:

RedBead.png

เพื่อเรียกใช้

เพียงเปิดหน้าต่างเทอร์มินัลและเปิดใช้การทดสอบการทำงานอัตโนมัติ:

$ scripts/autorun-tests
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.