คำถามติดแท็ก testing

การตรวจสอบพฤติกรรมของระบบซอฟต์แวร์กับพฤติกรรมที่คาดหวังของระบบนั้น

6
การทดสอบแบบกำหนดพารามิเตอร์ - เมื่อใดและเพราะเหตุใดคุณจึงใช้งาน
เมื่อเร็ว ๆ นี้ในที่ทำงานที่เราได้รับมีความแตกต่างบางส่วนของความเห็นเกี่ยวกับการที่มีการทดสอบ Parameterized โดยปกติเราใช้สไตล์ TDD (หรืออย่างน้อยพยายาม) เพื่อให้ฉันเข้าใจถึงประโยชน์ของการอนุมัตินั้น อย่างไรก็ตามฉันพยายามดิ้นรนเพื่อดูการทดสอบที่ได้รับจากพารามิเตอร์ สำหรับการอ้างอิงเราทำงานกับบริการและเป็นห้องสมุดที่เปิดเผยผ่านอินเตอร์เฟส RESTful สิ่งที่ฉันเคยเห็นคือการทดสอบอย่างน้อยก็ใช้ JUnit ภายใน Eclipse: รายละเอียดการขาด - เมื่อการทดสอบล้มเหลวมันเป็นเรื่องยากมากที่จะเห็นพารามิเตอร์ที่ทำให้มันล้มเหลว มักจะสร้างความซับซ้อน มีแนวโน้มที่จะถูกสร้างขึ้นหลังจากเขียนโค้ด - ไม่ใช่ข้อเสียเปรียบเช่นนี้ แต่ผู้คนเริ่มต้นด้วยการทดสอบแบบกำหนดพารามิเตอร์ไว้ในใจเมื่อพวกเขาเริ่มเขียนโค้ดหรือไม่? หากใครมีตัวอย่างของที่พวกเขามีประโยชน์จริง ๆ หรือแม้แต่คำแนะนำที่ดีสำหรับการใช้พวกเขาที่จะยอดเยี่ยม ฉันต้องการให้แน่ใจว่าฉันไม่เพียง แต่ถูกดื้อรั้นเพราะฉันไม่ได้เลือกที่จะใช้พวกเขาและดูว่าพวกเขาเป็นสิ่งที่เราควรพิจารณาเป็นส่วนหนึ่งของคลังแสงทดสอบของเราหรือไม่

7
บริษัท ขนาดใหญ่ของนักพัฒนาซอฟต์แวร์ตรวจสอบข้อบกพร่องในโปรแกรมของพวกเขาอย่างไร
ฉันสงสัยว่า บริษัท ผู้พัฒนาซอฟต์แวร์รายใหญ่ตรวจสอบข้อบกพร่องในโปรแกรมของพวกเขาอย่างไร พวกเขาแค่ทดสอบในคอมพิวเตอร์หลายเครื่องหรือไม่

2
วิธีการโอเพนซอร์สโครงการที่มีที่เก็บ git มีสื่อที่มีลิขสิทธิ์ในประวัติศาสตร์?
ฉันต้องการเผยแพร่โครงการซอฟต์แวร์บันทึกข้อมูลเสียงด้วยลายนิ้วมือภายใต้ลิขสิทธิ์ฟรี แต่พื้นที่เก็บข้อมูลมีไฟล์เสียงที่มีลิขสิทธิ์ กรณีทดสอบยังใช้ไฟล์เหล่านี้ในปัจจุบัน ฉันจะปล่อยรหัสต่อสาธารณะด้วยประวัติเวอร์ชันสูงสุด แต่ไม่ละเมิดลิขสิทธิ์ได้อย่างไร รายละเอียด: รหัสเป็นรุ่นภายใต้คอมไพล์ เราจะยุบมันทั้งหมดกลับเป็นสาขาเดียวก่อนที่จะปล่อย มีข้อมูลเสียง 400 MB ไฟล์บางไฟล์เป็นเพลงที่ได้รับอนุญาตฟรีจาก Jamendo ส่วนไฟล์อื่น ๆ เป็น MP3 จากคอลเล็กชันส่วนตัวของเรา ไม่ว่าเราจะใช้วิธีใดเราจะเก็บสำเนา repo ดั้งเดิมที่ไม่เปลี่ยนรูปเสมอเพื่อไม่ให้ทำลายประวัติโครงการ คำถามหลัก: วิธีจัดการกับการเปิดตัวสาธารณะ? ลบล้างประวัติทั้งหมดของไฟล์ที่เป็นปัญหาจากที่เก็บ git และปล่อย repo ที่แก้ไข (v64 ชี้วิธีการทำเช่นนี้) อีกทางเลือกหนึ่งให้จับภาพสถานะปัจจุบันของรหัสและไม่ต้องกังวลว่าจะมีประวัติสาธารณะของรหัสเผยแพร่ล่วงหน้า คำถามด้าน: เราจะหลีกเลี่ยงภาวะที่กลืนไม่เข้าคายไม่ออกนี้ได้อย่างไรในตอนแรกเนื่องจากบางครั้งจำเป็นต้องใช้รหัสหรือสื่อส่วนตัวสำหรับช่วงแรก ๆ ของโครงการ

2
RSpec vs Test :: Unit ใน Rails
ฉันไม่เคยมั่นใจในข้อดีที่คุณได้รับจากการเปลี่ยนไปใช้ RSpec จาก Test :: Unit ใน Ruby on Rails (แม้จะอ่านเกี่ยวกับ RSpec เป็นครั้งคราว) มันเกี่ยวกับ RSpec ที่โครงการ Rails ส่วนใหญ่ดูเหมือนว่าจะใช้หรือไม่ (ตัวอย่างโค้ดบางตัวอย่างที่แสดงให้เห็นข้อดีอย่างชัดเจนของอีกอันหนึ่งจะได้รับการชื่นชมมาก)

8
ไวท์บอร์ด“ ทดสอบ” ในระหว่างการสัมภาษณ์: วิธีสำรองรหัส (ไวท์บอร์ด) ของคุณถูกต้องหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ตามที่ฉันได้รับมีข้อผิดพลาด (แม้แต่พิมพ์ผิดเหมือนหรือขาดหายไป ";") ในโค้ดไวท์บอร์ดของคุณมักจะทำให้คุณเสียคะแนนในการสัมภาษณ์ การหลีกเลี่ยงสิ่งนั้นจะทำให้รหัสการอ่านที่พิสูจน์ได้อย่างหลีกเลี่ยงไม่ได้อีกครั้ง (เสียเวลาและอาจเป็นพลังงาน / สมาธิ) หรือแม้แต่การใช้อัลกอริทึมที่ง่ายกว่า (และมีประสิทธิภาพน้อยลง) - และทั้งสองวิธีนี้ ดังนั้นทำไมไม่เพียงแค่เขียนโค้ดที่รวดเร็วและสวยงามอย่างที่คุณจะมีกรอบการทดสอบ (หน่วย) ในการกำจัดของคุณและจากนั้นเพียงแค่ทดสอบมัน (บนไวท์บอร์ด) มีใครลอง / เห็นวิธีการนี้หรือไม่? ความคิดทั้งหมดมีค่าควรหรือไม่ [ยังใช้กับกรณีปากกาและกระดาษแน่นอน]

5
จะรวม TDD และ DDD ที่เข้มงวดได้อย่างไร
TDD เป็นเรื่องเกี่ยวกับการออกแบบโค้ดซึ่งได้รับคำแนะนำจากการทดสอบ ดังนั้นเลเยอร์ทั่วไปมักจะไม่สร้างล่วงหน้า พวกเขาควรปรากฏขึ้นเล็กน้อยผ่านขั้นตอนการรีแฟคเตอร์ การออกแบบที่ขับเคลื่อนด้วยโดเมนนั้นเกี่ยวข้องกับรูปแบบทางเทคนิคมากมายการกำหนดเลเยอร์ที่ได้รับการยอมรับเช่นแอพพลิเคชั่นเลเยอร์โครงสร้างพื้นฐานเลเยอร์โดเมนเลเยอร์คงอยู่ ในการเริ่มต้นการเข้ารหัสส่วนของโครงการ DDD ตั้งแต่เริ่มต้นจะทำอย่างไร? ฉันควรปล่อยให้การออกแบบโผล่ออกมาจากการทดสอบอย่างเคร่งครัดหรือไม่หมายถึงไม่มีการแยกข้อกังวล (ไม่มีเลเยอร์) และ refactor เพื่อให้พอดีกับรูปแบบทางเทคนิคของ DDD? หรือฉันควรสร้างเลเยอร์ที่ว่างเปล่าเหล่านั้น (แอปพลิเคชันหน่วยงาน / บริการโดเมนโครงสร้างพื้นฐาน) และให้ TDD เหมาะสมกับแต่ละชั้นอย่างอิสระ (ใช้ mocks เพื่อแยกระหว่างเลเยอร์)

5
หน่วยทดสอบวิธีการโมฆะ
เพื่อแก้ไขข้อผิดพลาดในการประยุกต์ใช้ผมปรับเปลี่ยนวิธีการตั้งชื่อโดยการเพิ่มการเรียกร้องให้เป็นวิธีการที่มีอยู่ชื่อ postLogingetShoppingCart รหัส protected void postLogin() { getShoppingCart(); } อย่างไรก็ตามฉันไม่แน่ใจว่าวิธีที่ดีที่สุดในการเขียนบททดสอบpostLoginคืออะไร วิธีที่ 1 ใช้การตรวจสอบจาก Mockito เพียงตรวจสอบว่าวิธีการนั้นถูกเรียก verify(mock).getShoppingCart(); วิธีที่ 2 ทดสอบผลข้างเคียงของการเรียกใช้เมธอดโดยเรียกค่าของตะกร้าสินค้าของผู้ใช้ AssertNotNull(user.getShoppingCart()); วิธีการหนึ่งดีกว่าวิธีอื่นหรือไม่?

1
หน่วยทดสอบไคลเอนต์และห่อหุ้ม API
ฉันวนเวียนวนไปรอบ ๆ เพื่อหาวิธีที่ดีที่สุดในการทดสอบหน่วยห้องสมุดลูกค้า API ที่ฉันกำลังพัฒนา ห้องสมุดที่มีClientระดับซึ่งโดยทั่วไปมี 1: การทำแผนที่ 1 กับ API และอีกชั้นซึ่งมีอินเตอร์เฟซที่ใช้งานง่ายขึ้นกว่าด้านบนของWrapperClient Wrapper --> Client --> External API ก่อนอื่นฉันเขียนการทดสอบทั้งคู่ClientและWrapperทดสอบอย่างมีประสิทธิภาพว่าจะส่งต่อไปยังฟังก์ชันที่เหมาะสมของสิ่งที่ทำงาน ( WrapperทำงานClientและClientทำงานกับการเชื่อมต่อ HTTP) ฉันเริ่มรู้สึกอึดอัดกับสิ่งนี้เพราะฉันรู้สึกว่าฉันกำลังทดสอบการใช้งานคลาสเหล่านี้มากกว่าที่จะเป็นส่วนต่อประสาน ในทางทฤษฎีฉันสามารถเปลี่ยนคลาสให้มีการใช้งานที่ถูกต้องสมบูรณ์แบบอื่น แต่การทดสอบของฉันจะล้มเหลวเพราะฟังก์ชั่นที่ฉันคาดว่าจะเรียกไม่ถูกเรียก ฟังดูเหมือนการทดสอบที่เปราะบางสำหรับฉัน หลังจากนี้ฉันคิดถึงอินเทอร์เฟซของคลาส การทดสอบควรตรวจสอบว่าชั้นเรียนทำงานตามที่ตั้งใจจริงมากกว่าที่จะทำ แล้วฉันจะทำสิ่งนี้ได้อย่างไร สิ่งแรกที่ควรคำนึงถึงคือการขัดคำขอ API ภายนอก อย่างไรก็ตามฉันกังวลใจเกี่ยวกับการขยายบริการภายนอก ตัวอย่างของ API ที่ถูก stubbed จำนวนมากที่ฉันเคยเห็นเพียงแค่ให้การตอบกลับสำเร็จรูปซึ่งดูเหมือนเป็นวิธีที่ง่ายมากที่จะทดสอบว่าโค้ดของคุณทำงานได้อย่างถูกต้องกับ API ปลอมของคุณ ทางเลือกคือการเยาะเย้ยบริการซึ่งเป็นไปไม่ได้และจะต้องได้รับการปรับปรุงให้ทันสมัยอยู่เสมอเมื่อใดก็ตามที่มีการเปลี่ยนแปลงการบริการจริง - ซึ่งรู้สึกว่าเกินความเป็นจริงและเสียเวลา ในที่สุดฉันอ่านข้อความนี้จากคำตอบอื่นของโปรแกรมเมอร์ SE : งานของไคลเอนต์ API ระยะไกลคือการออกสายบางอย่าง - …

5
Test Driven Development: วิธีที่ดี / เป็นที่ยอมรับในการทดสอบการทำงานของระบบไฟล์?
ฉันกำลังทำงานในโครงการในขณะนี้ที่สร้างตาราง (เหนือสิ่งอื่นใด) ตามเนื้อหาของระบบไฟล์และในทางกลับกันก็จะทำการแก้ไข meta-data บางอย่างในสิ่งที่พบ คำถามคือจะเขียนการทดสอบรอบนี้หรือตั้งค่าอย่างไร มีวิธีง่าย ๆ ในการเยาะเย้ยเรื่องนี้หรือไม่? หรือฉันควรตั้ง "กล่องแซนด์บ็อกซ์"?

3
นักพัฒนาในการทดสอบคืออะไร? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อเร็ว ๆ นี้ฉันได้พูดคุยกับนายหน้าที่ต้องการให้ฉันเป็น บริษัท ในตำแหน่ง Developer in Test เขาทำให้มันฟังดูเหมือนเป็นตำแหน่งที่คุณคุ้นเคยกับเทคนิคการเขียนโปรแกรมใหม่และทดสอบข้อบกพร่องและปรับปรุงซอฟต์แวร์ แต่คุณไม่ต้องกังวลเกี่ยวกับกำหนดเวลามาตรฐาน คุณมีความคิดสร้างสรรค์ในงานของคุณ แต่คำอธิบายนั้นยังคงคลุมเครือสำหรับฉัน ฉันเป็น Web Developer มาหลายปีแล้วส่วนใหญ่ทำงานใน PHP ดังนั้นฉันอยากรู้ว่าคนอื่น ๆ ในชุมชนรู้เพิ่มเติมเกี่ยวกับตำแหน่งเหล่านี้โดยทั่วไปหรือไม่ ฉันรู้ว่านี่อาจไม่เหมาะสมสำหรับฟอรัมนี้ แต่มันเป็นแบบที่ดีที่สุดที่ฉันสามารถหาได้ใน Stack Exchange และฉันจะขอบคุณถ้ามันไม่ได้ปิดเพราะไม่มีที่อื่นที่นี่เพื่อถามเกี่ยวกับมัน . ฉันลองใช้ Google แล้ว แต่มีข้อมูลไม่มากนัก นักพัฒนาในการทดสอบคืออะไร?

4
วิธีทำการทดสอบ API ภายนอก (Blackbox)
สมมติว่าคุณใช้ API จากผู้ขายวิธีการตรวจสอบให้แน่ใจว่า API ของพวกเขาทำงานได้ตามที่คาดไว้หรือไม่ ข้อกังวลหลักของฉันคือบางครั้งผู้ขายได้ผลักดันการเปลี่ยนแปลงรหัสของพวกเขาและทำลาย API เราต้องการมีซอฟต์แวร์อัตโนมัติบางประเภทเพื่อทดสอบพวกเขาอย่างต่อเนื่อง วิธีจัดการกับสิ่งนี้?

4
แนวปฏิบัติที่ดีที่สุดสำหรับโปรแกรมทดสอบที่มีพฤติกรรมสุ่มคืออะไร
เมื่อทำงานวิจัยและพัฒนาฉันมักพบว่าตัวเองกำลังเขียนโปรแกรมที่มีการสุ่มในระดับสูงในพฤติกรรมของพวกเขา ตัวอย่างเช่นเมื่อฉันทำงานในการเขียนโปรแกรมทางพันธุกรรมฉันมักจะเขียนโปรแกรมที่สร้างและรันซอร์สโค้ดแบบสุ่มโดยพลการ ปัญหาเกี่ยวกับการทดสอบรหัสดังกล่าวคือข้อผิดพลาดมักจะเป็นระยะ ๆ และอาจเป็นเรื่องยากที่จะทำซ้ำ สิ่งนี้นอกเหนือไปจากการตั้งค่าเมล็ดพันธุ์แบบสุ่มเป็นค่าเดียวกันและเริ่มต้นการดำเนินการ ตัวอย่างเช่นโค้ดอาจอ่านข้อความจาก kernal ring buffer จากนั้นทำการข้ามแบบมีเงื่อนไขกับเนื้อหาข้อความ ตามปกติสถานะของบัฟเฟอร์บัฟเฟอร์จะเปลี่ยนไปเมื่อพยายามทำซ้ำอีกครั้งในภายหลัง แม้ว่าพฤติกรรมนี้เป็นคุณสมบัติที่สามารถเรียกใช้รหัสอื่นในวิธีที่ไม่คาดคิดและมักจะพบข้อบกพร่องที่หน่วยทดสอบ (หรือผู้ทดสอบมนุษย์) ไม่พบ มีการกำหนดแนวปฏิบัติที่ดีที่สุดสำหรับระบบทดสอบประเภทนี้หรือไม่? ถ้าเป็นเช่นนั้นการอ้างอิงบางอย่างจะมีประโยชน์มาก ถ้าไม่คำแนะนำอื่น ๆ ยินดีต้อนรับ!

5
ควรทดสอบความซับซ้อนของอัลกอริทึมหรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร
สมมติว่าฉันกำลังใช้สิ่งที่ง่ายเช่นการค้นหารายการ / แถวลำดับ ฟังก์ชั่น (ใน c #) จะมีลักษณะคล้ายกับ: static int FindIndex(int[] sortedList, int i); ฉันสามารถนำไปใช้และทดสอบสิ่งนี้ในแง่ของฟังก์ชั่น แต่ด้วยเหตุผลที่ชัดเจนฉันมักจะชอบการค้นหาแบบไบนารีมากกว่าการค้นหาเชิงเส้นหรือบางสิ่งที่โง่โดยเจตนา ดังนั้นคำถามของฉันคือ: เราควรพยายามเขียนการทดสอบที่รับประกันประสิทธิภาพในแง่ของความซับซ้อนของอัลกอริทึมและถ้าเป็นเช่นนั้นได้อย่างไร ฉันได้เริ่มสร้างข้อโต้แย้งทั้งสองด้านของ "คุณ" เป็นส่วนหนึ่งของคำถามนี้ แต่ฉันต้องการเห็นสิ่งที่ผู้คนพูดโดยไม่มีข้อโต้แย้งของฉันเพื่อกระตุ้นพวกเขา ในแง่ของ "วิธี" ที่น่าสนใจมาก :) คุณสามารถดูการกำหนดพารามิเตอร์ของตัวดำเนินการเปรียบเทียบและมีการทดสอบซึ่งตัวดำเนินการเปรียบเทียบนั้นนับการเปรียบเทียบหรืออะไรทำนองนั้น แต่เพียงเพราะคุณไม่สามารถหมายความว่าคุณควร ... มีคนอื่นที่คิดว่าสิ่งนี้ (อาจ)? ขอบคุณ

5
หน่วยทดสอบสำหรับ csv parser
ฉันควรใช้การทดสอบใดในการทดสอบตัวแยกวิเคราะห์ csv ฉันมีตัวแยกวิเคราะห์ csv อย่างง่ายใน C # และฉันต้องการให้แน่ใจว่าฉันมีการทดสอบหน่วยครอบคลุมทุกกรณีขอบ (และผิดปกติ) ทั่วไป ฉันควรใช้การทดสอบประเภทใดเพื่อระบุปัญหาที่อาจเกิดขึ้นและคดีเขตแดน
14 testing  parsing 

4
การเขียนกรณีทดสอบการยอมรับ
เรากำลังรวมกระบวนการทดสอบในกระบวนการ SCRUM ของเรา บทบาทใหม่ของฉันคือการเขียนการทดสอบการยอมรับของเว็บแอปพลิเคชันของเราเพื่อทำการทดสอบในภายหลังโดยอัตโนมัติ ฉันได้อ่านมากมายเกี่ยวกับวิธีการเขียนกรณีทดสอบ แต่ไม่มีใครให้คำแนะนำเชิงปฏิบัติแก่ฉันในการเขียนกรณีทดสอบสำหรับเว็บแอปพลิเคชันที่ซับซ้อนและแทนที่จะใช้หลักการที่ขัดแย้งกันซึ่งฉันพบว่าใช้ยาก: กรณีทดสอบควรสั้น:นำตัวอย่างของ CMS กรณีทดสอบสั้น ๆ นั้นง่ายต่อการบำรุงรักษาและเพื่อระบุอินพุตและเอาต์พุต แต่ถ้าฉันต้องการทดสอบชุดการทำงานที่ยาวนาน (เช่นการเพิ่มเอกสารการส่งการแจ้งเตือนไปยังผู้ใช้รายอื่นผู้ใช้รายอื่นตอบกลับเอกสารการเปลี่ยนแปลงสถานะผู้ใช้จะได้รับการแจ้งเตือน) สำหรับฉันแล้วดูเหมือนว่ากรณีทดสอบควรแสดงถึงสถานการณ์ที่สมบูรณ์ แต่ฉันสามารถดูว่าสิ่งนี้จะผลิตเอกสารทดสอบที่ซับซ้อนมากเกินไป การทดสอบควรระบุอินพุตและเอาต์พุต::จะเป็นอย่างไรถ้าฉันมีรูปแบบยาวที่มีฟิลด์โต้ตอบจำนวนมากที่มีพฤติกรรมแตกต่างกัน ฉันจะเขียนหนึ่งการทดสอบสำหรับทุกสิ่งหรือไม่หรือสำหรับแต่ละการทดสอบ? กรณีทดสอบควรมีความเป็นอิสระ:แต่ฉันจะใช้สิ่งนั้นได้อย่างไรหากการทดสอบการดำเนินการอัปโหลดต้องการให้การเชื่อมต่อสำเร็จ และใช้กับการเขียนกรณีทดสอบได้อย่างไร ฉันควรจะเขียนการทดสอบสำหรับแต่ละการดำเนินการ แต่การทดสอบแต่ละครั้งจะประกาศการขึ้นต่อกันหรือฉันควรจะเขียนสถานการณ์ทั้งหมดสำหรับการทดสอบแต่ละครั้งอีกครั้ง? กรณีทดสอบควรจัดทำเป็นเอกสารเล็กน้อย:หลักการนี้เฉพาะกับโครงการ Agile ดังนั้นคุณมีคำแนะนำเกี่ยวกับวิธีการใช้หลักการนี้หรือไม่? แม้ว่าฉันคิดว่าการเขียนแบบทดสอบตอบรับจะเป็นเรื่องง่าย แต่ฉันก็พบว่าตัวเองตัดสินใจทุกอย่างที่ต้องทำ (FYI: ฉันเป็นนักพัฒนาและไม่ใช่ผู้ทดสอบมืออาชีพ) ดังนั้นคำถามหลักของฉันคือ: คุณมีขั้นตอนหรือคำแนะนำอะไรบ้างในการเขียนเคสทดสอบการยอมรับที่ยอมรับได้สำหรับการใช้งานที่ซับซ้อน ขอขอบคุณ. แก้ไข : เพื่อชี้แจงคำถามของฉัน: ฉันทราบว่าการทดสอบการยอมรับควรเริ่มจากข้อกำหนดและพิจารณาว่าแอปพลิเคชันทั้งหมดเป็นกล่องดำ คำถามของฉันเกี่ยวข้องกับขั้นตอนการปฏิบัติในการเขียนเอกสารทดสอบระบุกรณีทดสอบจัดการกับการอ้างอิงระหว่างการทดสอบ ... สำหรับเว็บแอปพลิเคชันที่ซับซ้อน

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