การทดสอบการรวมในโครงการ OSS - วิธีจัดการกับบุคคลที่สามด้วยการรับรองความถูกต้อง?


10

หนึ่งในโปรเจ็กต์อดิเรก (โอเพ่นซอร์ส) ของฉันคือเครื่องมือสำรองซึ่งทำให้การสำรองข้อมูลออฟไลน์ของที่เก็บจาก GitHub, Bitbucket เป็นต้น
มันเรียก API ของ hosters เพื่อรับรายการที่เก็บข้อมูล ดึงที่เก็บไปยังเครื่องคอมพิวเตอร์

ดังนั้นฉันจึงมีการทดสอบการรวมที่ฉันเรียก GitHub API ด้วยการตรวจสอบ
(และเมื่อคุณสมบัติการโคลน / ดึงเสร็จอาจมีการทดสอบว่าที่เก็บโคลนจาก GitHub และต้องรับรองความถูกต้องด้วย)

ฉันสร้างผู้ใช้และองค์กรโดยเฉพาะสำหรับใช้ในการทดสอบการรวมกลุ่มเหล่านี้

ปัญหา: ฉันไม่สามารถเข้ารหัสรหัสผ่านที่ยากที่ไหนสักแห่งในซอร์สโค้ดได้เนื่องจากเป็นโอเพ่นซอร์สและรหัสนั้นเป็นสาธารณะใน GitHub


สิ่งที่ฉันทำตอนนี้

ในการทดสอบฉันได้รับชื่อผู้ใช้รหัสผ่านและชื่อที่เก็บจากตัวแปรสภาพแวดล้อมทั้งหมด
นี่คือตัวอย่าง :

config.Name = TestHelper.EnvVar("GithubApiTests_Name");
config.Password = TestHelper.EnvVar("GithubApiTests_PW");

( TestHelper.EnvVarเป็นวิธีตัวช่วยซึ่งรับค่าของตัวแปรสภาพแวดล้อมและส่งข้อยกเว้นเมื่อไม่มีอยู่)

จากนั้นฉันมีไฟล์แบตช์ซึ่งตั้งค่าตัวแปรสภาพแวดล้อมเหล่านั้น
ตัวจริง ( environment-variables.bat) เรียกในสคริปต์สร้างของฉันและก่อนที่จะดำเนินการทดสอบ แต่ละเว้นในการควบคุมแหล่งที่มาดังนั้นจึงไม่ได้อยู่ในที่เก็บจริงของฉัน

สิ่งที่อยู่ในการควบคุมแหล่งที่มาenvironment-variables.bat.sampleซึ่งตั้งค่าตัวแปรสภาพแวดล้อมเดียวกัน แต่ใช้รหัสผ่านปลอม:

rem copy/rename this file to environment-variables.bat

echo Setting environment variables for integration tests...

set GithubApiTests_Name=scm-backup-testuser
set GithubApiTests_OrgName=scm-backup-testorg
set GithubApiTests_PW=not-the-real-password
set GithubApiTests_Repo=scm-backup

ดังนั้นฉันสามารถโคลนที่เก็บไปยังเครื่องของฉันเปลี่ยนชื่อไฟล์นี้เพื่อenvironment-variables.batแทนที่รหัสผ่านปลอมด้วยรหัสจริงและการทดสอบการรวมทั้งหมดจะทำงาน

สิ่งนี้ใช้ได้กับการรวมอย่างต่อเนื่องเช่นกัน - ฉันใช้ AppVeyor และฉันสามารถตั้งค่าตัวแปรสภาพแวดล้อมเหล่านี้ในเว็บ UIได้


สิ่งที่ฉันไม่ชอบเกี่ยวกับมัน

ฉันคิดว่ามันไม่ใช่ทางออกที่ดีสำหรับโครงการ OSS และโดยเฉพาะอย่างยิ่งไม่ใช่สำหรับโครงการนี้ :

ในทางทฤษฎีผู้มีส่วนร่วมในโครงการของฉันจะสามารถทำการทดสอบการรวมได้ในขณะนี้โดย:

  • สร้างผู้ใช้ทดสอบและองค์กรทดสอบของเขาเองบน GitHub
  • สร้างที่เก็บข้อมูลทดสอบ
  • การสร้างเวอร์ชันของเขาเองenvironment-variables.batด้วยค่าที่ต่างกัน

ปัญหาคือแอปพลิเคชันของฉันจะสามารถสำรองข้อมูล hosters หลายรหัส
ตอนนี้รองรับ GitHub เท่านั้น แต่มันจะง่ายต่อการเพิ่มการสนับสนุนสำหรับ hosters มากขึ้นโดยการเพิ่มคลาสไม่กี่คลาสที่ใช้อินเตอร์เฟสที่เหมาะสม

ดังนั้นเมื่อฉันใช้การสนับสนุน hosters เพิ่มเติมในภายหลังจำนวนของตัวแปรสภาพแวดล้อมจะเพิ่มขึ้น
เพื่อให้สามารถดำเนินการทุกการทดสอบบูรณาการการมีส่วนร่วมที่มีศักยภาพที่จะสร้างผู้ใช้เององค์กรและเก็บการทดสอบของเขาที่ GitHub, Bitbucket, GitLab, .... และผู้ที่รู้มากขึ้นหลายวิธีและเพิ่มทั้งหมดของพวกเขาเพื่อเขาenvironment-variables.batรุ่น

มีวิธีแก้ปัญหาที่ดีกว่าในโครงการที่เป็นรหัสสาธารณะหรือไม่?

ฉันรู้ว่าโครงการอื่นทำสิ่งที่คล้ายกับที่ฉันกำลังทำอยู่ ตัวอย่างเช่น
Octokit.netมีสคริปต์สำหรับตั้งค่าตัวแปรสภาพแวดล้อมสำหรับการทดสอบการรวมระบบที่เรียก GitHub API
แต่พวกเขาต้องการเพียงหนึ่งผู้ใช้และหนึ่งองค์กรและฉันจะต้องการมากขึ้น

บางทีฉันอาจไม่ต้องการโซลูชันที่ช่วยให้ผู้มีส่วนร่วมทำการทดสอบการรวมระบบทั้งหมดได้
ตัวอย่างเช่นหากมีคนต้องการมีส่วนร่วมในการสนับสนุน GitHub ของโครงการของฉันเขาจะต้องสามารถทำการทดสอบการรวม GitHub เท่านั้น
ดังนั้นบางทีฉันอาจต้องใช้วิธีที่มีสติเพื่อแบ่งการทดสอบการรวมกลุ่มของฉันออกเป็นจำนวนอนันต์ของ "กลุ่ม" (?) แล้วพูดว่า "และตอนนี้ทำการทดสอบทั้งหมดซึ่งเป็นของกลุ่ม 'Github'"

คำตอบ:


2

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

เพื่อให้สามารถดำเนินการทดสอบการรวมกลุ่มได้ผู้สนับสนุนที่มีศักยภาพจะสร้างผู้ใช้องค์กรและที่เก็บการทดสอบที่ GitHub, Bitbucket, GitLab, .... และผู้ที่รู้มากขึ้นและเพิ่มพวกเขาทั้งหมดลงในตัวแปรสภาพแวดล้อมของเขา รุ่น. bat

ใช่มันเป็นความจริง แต่ผู้ให้ข้อมูลไม่จำเป็นต้องทำการทดสอบการรวมทั้งหมดก่อนที่จะสร้าง PR ในโครงการของคุณ เมื่อสร้าง PR แล้ว CI จะทำการทดสอบเต็มรูปแบบ

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

สำหรับผู้สนับสนุนปกติ / ที่เชื่อถือได้คุณสามารถทำให้พวกเขามีส่วนร่วมจริงในโครงการของคุณซึ่งควรอนุญาตให้พวกเขาเรียกใช้ CI ในสาขาของพวกเขาก่อนที่จะทำการประชาสัมพันธ์

ที่กล่าวว่าคุณไม่ได้ป้องกันผู้มีส่วนร่วมในการเรียกใช้ชุดทดสอบเต็มรูปแบบ พวกเขาสามารถให้ข้อมูลประจำตัวของ GitHub ของตนเองหรือสร้างบัญชีทดสอบของตนเองและผู้สนับสนุนปกติจะทำเช่นนี้

การปรับเปลี่ยนที่ฉันแนะนำคือ:

ก่อนอื่นทำการทดสอบหน่วยการครอบคลุมของคุณให้มากที่สุด สิ่งเหล่านี้ควรครอบคลุมทุกสาขาของ codebase ของคุณ

ประการที่สองการเขียนการทดสอบการรวมที่จุดสิ้นสุดถูกจำลอง คุณสามารถจำลองเลเยอร์การขนส่งของ API เหล่านี้และจำลองการไหลของคำขอ / ตอบกลับ HTTP โดยเริ่มบริการปลอม GitHub ตัวอย่างเช่น (ในรหัสเทียม):

// Test failed authentication to GitHub
val server = new WebServer("localhost", 9453, { request =>
    return Response(401, "unauthenticated")
})
server.start()
val backupService = new GitHubBackupService("http://localhost:9453")
backupService.backup must throw UnauthenticatedException()
server.stop()

การทดสอบเหล่านี้จะมีความซับซ้อนมากขึ้น แต่จะช่วยให้คุณ

  1. ทดสอบโดยไม่สร้างบัญชีปลอมและที่เก็บ
  2. ทดสอบเงื่อนไขความล้มเหลวซึ่งยากที่จะจำลองด้วย GitHub จริง ตัวอย่างเช่น 502 การตอบสนอง, หมดเวลาเชื่อมต่อ, หน่วยตอบสนองที่ผิดปกติ / ไม่สามารถตรวจสอบได้

สามปิดการใช้งานการทดสอบใด ๆ ที่ต้องการความรู้พิเศษจากการทำงานภายใต้โครงสร้างปกติ ในเครื่องมือการจัดการการสร้างส่วนใหญ่จะมีวิธีการแยกการทดสอบการรวมหรือการทดสอบแท็กและเรียกใช้พวกเขาเลือก ผู้มีส่วนร่วมควรสามารถสร้างและทดสอบซอฟต์แวร์ได้โดยไม่ต้องมีการกำหนดค่าล่วงหน้า ชุดทดสอบเต็มควรรันหลังจากแต่ละบิลด์ใน CI

ขั้นสุดท้ายให้จัดทำเอกสารการทดสอบและวิธีการเรียกใช้ในเอกสารทดสอบของคุณเพื่อให้ผู้มีส่วนร่วมสามารถเลือกใช้งานได้

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