Golang ทดสอบในไดเรกทอรีย่อย


123

ฉันต้องการสร้างแพ็คเกจใน Go พร้อมการทดสอบและตัวอย่างสำหรับแพ็กเกจเป็นไดเร็กทอรีย่อยเพื่อให้พื้นที่ทำงานสะอาดขึ้น เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นได้อย่างไร

เอกสารทั้งหมดจะวางโค้ดการทดสอบไว้ที่เดียวกับโค้ดอื่นเสมอซึ่งจะดีกว่าในทางใดทางหนึ่งหรือเพียงแค่แบบแผน?


5
หมายเหตุ: go test ./...จะเรียกใช้การทดสอบในโฟลเดอร์ปัจจุบันและโฟลเดอร์ย่อยทั้งหมด ดูคำตอบของฉันด้านล่าง
VonC


ฉันกำลังคิดในสิ่งเดียวกัน มีปัญหาในการทดสอบ na แยก dir เนื่องจาก Diretor ในระดับเดียวกันมี dirs ย่อย
filthy_wizard

คำตอบ:


204

โปรดทราบว่าคุณสามารถเรียกใช้go test"ซ้ำ" คุณต้องแสดงรายการแพคเกจทั้งหมดที่คุณต้องการที่จะทดสอบ

หากคุณอยู่ในโฟลเดอร์รูทของโปรเจ็กต์ Go ของคุณให้พิมพ์:

go test ./...

ว่า ' ./...' สัญกรณ์อธิบายไว้ในส่วน " คำอธิบายของรายการแพคเกจ " ของ " คำสั่งgo ":

เส้นทางการนำเข้าเป็นรูปแบบหากมี...สัญลักษณ์แทน "" หนึ่งตัวหรือมากกว่าซึ่งแต่ละรายการสามารถจับคู่สตริงใดก็ได้รวมทั้งสตริงว่างและสตริงที่มีเครื่องหมายทับ

รูปแบบดังกล่าวจะขยายไปยังไดเร็กทอรีแพ็กเกจทั้งหมดที่พบในGOPATHต้นไม้ที่มีชื่อตรงกับรูปแบบ

ในกรณีพิเศษให้x/...จับคู่xและxไดเรกทอรีย่อยของ
ตัวอย่างเช่นnet/...ขยายnetและแพ็กเกจในไดเร็กทอรีย่อย


หากคุณเก็บ_test.goไฟล์ไว้ในโฟลเดอร์ย่อยgo test ./...คำสั่ง '' จะสามารถเลือกไฟล์ได้
แต่:

  • คุณจะต้องนำหน้าตัวแปรและฟังก์ชันที่ส่งออก (ใช้ในการทดสอบของคุณ) ด้วยชื่อแพ็กเกจของคุณเพื่อให้ไฟล์ทดสอบสามารถเข้าถึงเนื้อหาที่ส่งออกของแพ็กเกจได้
  • คุณจะไม่สามารถเข้าถึงเนื้อหาที่ไม่ได้ส่งออก

ตามที่กล่าวไว้ฉันยังคงต้องการเก็บ_test.goไฟล์ไว้ข้างไฟล์ต้นฉบับหลักเพราะหาได้ง่ายกว่า


4
บางคนอาจโต้แย้งว่าการไม่เข้าถึงข้อมูลส่วนตัวเป็นการทดสอบกล่องดำปกติและดีกว่า เกี่ยวกับการต้องมีคุณสมบัติเป็นสัญลักษณ์สาธารณะคุณสามารถนำเข้า _ "... " ได้ตลอดเวลา
ddevienne

15

วางการทดสอบของคุณควบคู่ไปกับรหัสของคุณในไดเรกทอรีเดียวกันในไฟล์ที่เรียกว่าfile_test.go"ไฟล์" คือชื่อของไฟล์ซอร์สโค้ดที่คุณกำลังทดสอบ นี่เป็นแบบแผนและฉันพบว่าดีที่สุดในประสบการณ์ของตัวเอง

หากgo testเครื่องมือนั้นไม่เป็นแบบอัตโนมัติเพียงพอสำหรับคุณคุณอาจดูGoConveyซึ่งมี UI ของเว็บที่จะอัปเดตและเรียกใช้การทดสอบ Go แบบเดิมโดยอัตโนมัติรวมถึงการทดสอบ GoConvey (ซึ่งขึ้นอยู่กับพฤติกรรมและมีการจัดทำเอกสารด้วยตนเองมากขึ้น กว่าการทดสอบ Go แบบเดิม ๆ )


2
GoConvey ยอดเยี่ยมมาก (และฉันกำลังรอ UI ใหม่ด้วยความคาดหวังสูง) ฉันใช้มันในโปรเจ็กต์ปัจจุบันของฉันเช่นในgithub.com/VonC/asciidocgo/blob/master/abstractNode_test.goเป็นต้น) อย่างไรก็ตามgo testยังสามารถทำงานกับโฟลเดอร์ย่อยได้ ดูคำตอบของฉันด้านล่าง
VonC

ใช่คุณเป็น อันที่จริงมันน่าจะเกี่ยวข้องมากกว่าคำตอบของฉันสำหรับคำถามนี้
Matt

10

แก้ไข

สร้างขึ้นจากคำตอบของ VonC

go1.11คำตอบนี้เป็นที่ถูกต้องใน ยังไม่มีการทดสอบในgoเวอร์ชันบน

สำหรับผู้ที่ต้องการเก็บการทดสอบไว้ในโฟลเดอร์ย่อยให้พูดtestแล้วเรียกใช้

go test ./...

จะพยายามเรียกใช้การทดสอบในทุกโฟลเดอร์แม้กระทั่งโฟลเดอร์ที่ไม่มีการทดสอบใด ๆ จึงมี?รายงานในภายหลังสำหรับโฟลเดอร์ที่ไม่มีการทดสอบ

วิ่ง

go test ./.../test

จะกำหนดเป้าหมายเฉพาะtestโฟลเดอร์ของคุณแทนดังนั้นจึงมีรายงานทั้งหมดที่เน้นเฉพาะโฟลเดอร์การทดสอบของคุณเท่านั้น

ข้อควรระวัง

โปรดทราบว่าการใช้โฟลเดอร์ย่อยทดสอบจะป้องกันการคำนวณรายงานความครอบคลุม ปรัชญาของการไปคือการทิ้งไฟล์ทดสอบไว้ในโฟลเดอร์แพ็คเกจ


1
เคล็ดลับดีๆนอกเหนือจากคำตอบอายุห้าขวบของฉัน upvoted
VonC

แอนนาที่รักโปรดอธิบายสิ่งที่ไม่ได้ผล? แล้ว go ของคุณเป็นเวอร์ชั่นไหน? คุณพยายามจะทำอะไร? ฉันตระหนักในภายหลังว่าวิธีนี้ไม่อนุญาตให้คำนวณการครอบคลุมโค้ดซึ่งเป็นเรื่องเล็กน้อย นี่คือสิ่งที่คุณหมายถึง?
avi.elkharrat

1
go test ./.../testส่งกลับgo: warning: "./.../test" matched no packages// ไม่ได้กำหนดเป้าหมายเฉพาะโฟลเดอร์ทดสอบเท่านั้น go version go1.13 darwin / amd64
anna

1
@Madeo สิ่งนี้จะทำให้รู้สึกได้เพราะ golang ไม่สนับสนุนให้แยกการทดสอบและรหัส ความผิดปกติคือการอนุญาตในเวอร์ชันก่อนหน้า
avi.elkharrat

1
@ avi.elkharrat และในความเป็นจริงฉันได้ตัดสินใจที่จะไม่ใช้วิธีนี้อีกต่อไปแม้ว่าฉันจะชอบเก็บการทดสอบไว้ในแพ็คเกจ / โฟลเดอร์แยกต่างหาก = (
Madeo

-4

ปกติฉันไม่ได้ทำการทดสอบ แต่คุณสามารถจัดกลุ่มไฟล์ของคุณเป็นไดเร็กทอรีและใช้การนำเข้าเช่น

import "./models"ถ้าออกหนึ่งระดับ
import "../modelsถ้าอยู่ในระดับหนึ่งและหนึ่งระดับใน

ตัวอย่างเช่นสำหรับ:
./models/todo.go
./test/todo_test.go

เพื่อทดสอบtodo.goจากtodo_test.goการนำเข้าของคุณในtodo_test.goพินัยกรรม

import "../models"


วิธีการนำเข้ารหัสนี้ใช้ได้กับฟังก์ชันที่เปิดเผยเท่านั้น ดูเหมือนจะไม่ทำงานเหมือนอยู่ในแพ็คเกจเดียวกันแม้ว่าคุณจะคิดว่าคุณใส่ไว้ในแพ็คเกจเดียวกันอย่างชัดเจนก็ตาม ดังนั้นวิธีนี้จึงไม่สามารถแก้ปัญหาสำหรับการทดสอบหน่วยได้อย่างแท้จริง
The Graceful Penguin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.