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

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


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

3
TDD สำหรับการประมวลผลแบบแบตช์: จะทำอย่างไร?
ฉันชอบ "สีแดง / สีเขียว / refactor" สำหรับ RoR ฯลฯ ก็โอเค งานวันของฉันเกี่ยวข้องกับการประมวลผลแบบแบตช์ไฟล์ที่มีขนาดใหญ่มากจากบุคคลที่สามในหลามและเครื่องมือที่กำหนดเองอื่น ๆ การเปลี่ยนแปลงคุณลักษณะของไฟล์เหล่านี้สูงดังนั้นจึงมีการแก้ไข / ปรับปรุงจำนวนมากที่ใช้บ่อย การทดสอบการถดถอยผ่านเนื้อหาการทดสอบที่รู้จักซึ่งมีผลลัพธ์ที่คาดหวังไม่มีอยู่ สิ่งที่ใกล้เคียงที่สุดกำลังทำงานกับชุดสุดท้ายที่มีกรณีทดสอบใหม่ที่เขียนด้วยมือตรวจสอบให้แน่ใจว่ามันไม่ระเบิดจากนั้นใช้การตรวจสอบเฉพาะจุดและการทดสอบทางสถิติเพื่อดูว่าข้อมูลยังดูดีหรือไม่ Q >> จะนำหลักการของ TDD มาสู่สิ่งแวดล้อมแบบนี้ได้อย่างไร?
14 testing  tdd 

3
จะจำลองเหตุการณ์ที่ทำให้เกิดข้อยกเว้นเพื่อทดสอบบล็อกลอง / จับได้อย่างไร
ฉันเข้าใจวิธีการทำงานของข้อยกเว้นและวิธีการจับและจัดการกับมันใน C # แต่ฉันจะจำลองเหตุการณ์ที่อาจทำให้เกิดข้อยกเว้นเพื่อให้แน่ใจว่าถูกจับได้อย่างถูกต้องหรือไม่ ตัวอย่างเช่นเป็นไปได้หรือไม่ที่จะเรียกใช้แอปพลิเคชันในรูปแบบของเตียงทดสอบที่สามารถจำลองปัญหาเครือข่ายปัญหาฐานข้อมูลและอื่น ๆ ได้หรือไม่? ข้อยกเว้นโดยธรรมชาติของพวกเขาดูเหมือนจะยากที่จะทำซ้ำจึงทำให้ยากที่จะมั่นใจได้ว่ารหัสของคุณสามารถรับมือกับพวกเขาได้ แม้ว่าฉันส่วนใหญ่จะพัฒนาโดยใช้ C # /. NET / Visual Studio คำตอบหรือแหล่งข้อมูลที่เกี่ยวข้องกับภาษาอื่นอาจมีประโยชน์
14 c#  testing  exceptions 

6
แต่ละวิธีควรมีคลาสทดสอบ JUnit แยกต่างหากหรือไม่?
ฉันกำลังเขียนการทดสอบหน่วย JUnit สำหรับชั้นเรียนของฉัน มันจะดีกว่าถ้ามีคลาสแยกสำหรับแต่ละวิธีหรือมีคลาสทดสอบเพียงหนึ่งสำหรับทุกคลาสจริง

1
จะทดสอบโค้ดประมวลผลภาพได้อย่างไร?
ฉันทำงานในการประมวลผลภาพ (ส่วนใหญ่เป็น OCR) และฉันสงสัยว่าฉันควรรวมการทดสอบหน่วยในการพัฒนาของฉันอย่างไร ฉันใช้การทดสอบหน่วยสำหรับรหัสประเภท "ทั่วไป" มากกว่านี้ แต่เมื่อจัดการกับรหัสการประมวลผลภาพฉันไม่แน่ใจว่าจะจัดการกับมันอย่างไร รหัสชนิดนี้ต้องการข้อมูลอินพุต / เอาท์พุตของภาพเสมอและการเยาะเย้ยสิ่งนี้ไม่ชัดเจน สำหรับตอนนี้ฉันส่วนใหญ่ทำการทดสอบการรวม แต่พวกเขาใช้เวลาสักครู่ในการทำงานและฉันต้องการความคิดเกี่ยวกับวิธีการแบ่งรหัสประเภทนี้เป็นการทดสอบหน่วยเพื่อให้ฉันสามารถเรียกใช้พวกเขาได้เร็วขึ้น แก้ไข: การวิเคราะห์ตัวละครสามารถผ่านหลายขั้นตอนที่เกี่ยวข้องกับการหมุนหลายครั้งการปรับขนาดและการทำงานของก้าน ขั้นตอนเหล่านี้เปลี่ยนแปลงบ่อยครั้งเมื่ออัลกอริทึมกำลังพัฒนา ดังนั้นอินพุทและเอาท์พุทที่คาดหวังสามารถพัฒนาได้มากในขณะทดสอบ อักขระแต่ละตัวสามารถมีขนาด 100x100 พิกเซลได้ดังนั้นจึงไม่สามารถเข้ารหัสในรหัสหรือทำงานกับข้อมูลที่สร้างขึ้นได้

3
จะทำให้การทดสอบอัตโนมัติเป็นที่นิยมได้อย่างไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฐานรหัสของเราเติบโตขึ้นเป็นเวลา 20 ปีแล้ว เราทำงานประมาณ 10 devs + sqa กับ 500kloc เมื่อไม่นานมานี้ทีมเล็ก ๆ ของเรา (2 devs หนึ่งจาก sqa) เริ่มทำงานกับโปรแกรมทดสอบอัตโนมัติ ปัจจุบันการวิ่งหนึ่งครั้งใช้เวลา 11 ชั่วโมงและเป็นการทดสอบการรวมระบบ เรากำลังดำเนินการเพื่อแก้ไขปัญหานี้และลดผลบวกปลอมและกำลังดำเนินการต่อไป แต่รายละเอียดไม่สำคัญ มันใช้งานได้โอเคและเราก็ทำการปรับปรุงต่อไป พวกเรา (ทีมเล็ก) ชอบมันมาก ถ้าเราทำลายบางสิ่งบางอย่างเราจะสังเกตเห็นอีกหนึ่งวันต่อมาและไม่ใช่ 2 เดือนต่อมาเมื่อ sqa ดู นอกจากนี้ผู้จัดการของเรา (dev + sqa) ชอบความคิด แต่คนอื่น ๆ ในทีมเพียงแค่เพิกเฉยผลการทดสอบ ในใจของพวกเขาหากการทดสอบล้มเหลวหลังเช็คอินมันเป็นปัญหาของการทดสอบไม่ใช่การเปลี่ยนรหัสและเป็นเพียงโครงการของเล่นของเรา เรามีการหารือหลายครั้งหากการทดสอบที่ล้มเหลวเป็นข้อผิดพลาดจริง เวลาส่วนใหญ่มันเป็น …

2
จะไปเกี่ยวกับการทดสอบรหัสยกเลิกการฉีดได้อย่างไร
ดังนั้นฉันจึงมีรหัสชิ้นส่วนต่อไปนี้ที่ใช้งานได้ทั่วระบบของฉัน ขณะนี้เรากำลังเขียนการทดสอบหน่วยย้อนหลัง (ดีกว่าไม่เป็นอาร์กิวเมนต์ของฉัน) แต่ฉันไม่เห็นว่าสิ่งนี้จะทดสอบได้อย่างไร public function validate($value, Constraint $constraint) { $searchEntity = EmailAlertToSearchAdapter::adapt($value); $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords()); $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity); $query = $adapter->setupBuilder()->build(); $totalCount = $this->advertType->count($query); if ($totalCount >= self::MAXIMUM_MATCHING_ADS) { $this->context->addViolation( $constraint->message ); } } แนวคิดนี้ควรใช้ได้กับทุกภาษา แต่ฉันใช้ PHP รหัสจะสร้างวัตถุแบบสอบถาม ElasticSearch โดยยึดตามSearchวัตถุซึ่งจะถูกสร้างขึ้นจากEmailAlertวัตถุ สิ่งเหล่านี้SearchและEmailAlertเป็นเพียงของ POPO ปัญหาของฉันที่ฉันไม่เห็นว่าฉันสามารถเยาะเย้ยออกSearcherFactory(ซึ่งใช้วิธีการคง) หรือSearchEntityToQueryAdapterที่ต้องการผลที่ได้จากSearcherFactory::getSearchDirector และSearchอินสแตนซ์ ฉันจะฉีดสิ่งที่สร้างขึ้นจากผลลัพธ์ภายในวิธีการได้อย่างไร อาจมีรูปแบบการออกแบบบางอย่างที่ฉันไม่ทราบ? …

4
วิธีทดสอบโค้ดที่ขึ้นอยู่กับ API ที่ซับซ้อน (เช่น Amazon S3)
ฉันกำลังดิ้นรนกับการทดสอบวิธีการอัปโหลดเอกสารไปยัง Amazon S3 แต่ฉันคิดว่าคำถามนี้ใช้กับ API / การพึ่งพาภายนอกที่ไม่สำคัญใด ๆ ฉันเพิ่งได้วิธีแก้ปัญหาที่อาจเกิดขึ้นสามข้อ แต่ก็ไม่น่าพอใจ: ทำการเรียกใช้รหัสอัปโหลดเอกสารตรวจสอบกับ API ของ AWS ว่ามีการอัปโหลดแล้วและลบออกเมื่อสิ้นสุดการทดสอบ สิ่งนี้จะทำให้การทดสอบช้ามากจะเสียค่าใช้จ่ายทุกครั้งที่ทำการทดสอบและจะไม่ส่งคืนผลลัพธ์เดียวกัน จำลอง S3 มันมีขนดกมากเพราะฉันไม่รู้ว่าภายในของวัตถุนั้นและรู้สึกผิดเพราะมันซับซ้อนเกินไป เพียงตรวจสอบให้แน่ใจว่า MyObject.upload () ถูกเรียกด้วยอาร์กิวเมนต์ที่ถูกต้องและมั่นใจว่าฉันใช้วัตถุ S3 อย่างถูกต้อง ทำให้ฉันรำคาญใจเพราะไม่มีทางรู้แน่ว่าฉันใช้ S3 API อย่างถูกต้องจากการทดสอบเพียงอย่างเดียว ฉันตรวจสอบว่า Amazon ทดสอบ SDK ของตัวเองอย่างไรและพวกเขาทำทุกอย่างเยาะเย้ย พวกเขามีผู้ช่วย 200 สายที่ทำหน้าที่เยาะเย้ย ฉันไม่รู้สึกว่ามันเป็นเรื่องจริงสำหรับฉันที่จะทำเช่นเดียวกัน ฉันจะแก้ปัญหานี้ได้อย่างไร
13 testing  mocking 

1
กลยุทธ์การทดสอบเกม
ฉันได้รับเกมการศึกษาทางเว็บ ปีที่ผ่านมาฉันได้ทำงานเพื่อรักษาเสถียรภาพโค้ดและเพิ่มคุณสมบัติใหม่ ตรรกะส่วนใหญ่อยู่ใน Front-end ดังนั้นการทดสอบยูนิตส่วนหลังจึงมีประโยชน์ครอบคลุมรหัสเล็กน้อย เกมดังกล่าวได้มาถึงจุดที่มันเริ่มซับซ้อน มีสองโหมดที่แตกต่างกันสำหรับแต่ละเกมและเกมจะทำงานแตกต่างกันไปตามโหมด นอกจากนี้ยังมีธงต่าง ๆ ที่ส่งผลต่อการเล่นเกม ฉันเป็นนักพัฒนาแอพพลิเคชั่นมานานกว่า 10 ปีและนี่ทำให้ฉันงุนงง ในโลกธุรกิจอัลกอริทึมจะทำหน้าที่ในลักษณะเดียวกันเสมอ ฉันจะเขียนการทดสอบหน่วยสำหรับอัลกอริทึมฉันจะคาดหวังค่า 42 และมันจะผิดพลาดถ้าฉันไม่ได้รับค่านั้น เมื่อพูดถึงเกมฉันหลงทาง ฉันจะทดสอบพวกเขาได้อย่างไร ฉันมีผู้ทดสอบให้ฉัน ฉันสามารถใช้เวลาเขียนแบบทดสอบหน่วย ผู้ทดสอบ ... ไม่น่าเชื่อถือ พวกเขาไม่ได้ดีที่สุดในการขจัดปัญหาและฉันไม่ได้ให้ทิศทางที่ดีที่สุดแก่พวกเขา ใช้เวลาไม่นานในการทดสอบการปล่อยและการรวมกันของเกมทุกครั้งฉันจะใช้มันเป็นทรัพยากรได้อย่างไร การทดสอบหน่วยดู จำกัด เนื่องจากตรรกะส่วนใหญ่เป็นจาวาสคริปต์ (และฉันรับรหัสสปาเก็ตตี้) ฉันสามารถใช้ชุดส่วนหน้าเช่น Cucumber หรือซีลีเนียมเพื่อให้แน่ใจว่าคุณสมบัติบางอย่างทำงานได้ นั่นเป็นกลยุทธ์ที่ดีที่สุดเหรอ? บริษัท เกมทำการทดสอบเกมอย่างไร ฉันได้อ่านคำถาม " ทดสอบการพัฒนาเพื่อรองรับเกมที่ซับซ้อน " (ท่ามกลางเกมอื่น ๆ ในไซต์) แต่ไม่ได้กล่าวถึงสิ่งที่ฉันกำลังมองหา ฉันขอกลยุทธ์ไม่ใช่ตัวอย่างเฉพาะของวิธีทดสอบ

6
การเขียนโปรแกรมตามสัญญาและการทดสอบหน่วย
ฉันเป็นโปรแกรมเมอร์ที่ค่อนข้างป้องกันและเป็นแฟนตัวยงของ Microsoft Code Contracts ตอนนี้ฉันไม่สามารถใช้ C # และในภาษาส่วนใหญ่เครื่องมือเดียวที่ฉันมีคือการยืนยัน ดังนั้นฉันมักจะจบลงด้วยรหัสเช่นนี้: class { function() { checkInvariants(); assert(/* requirement */); try { /* implementation */ } catch(...) { assert(/* exceptional ensures */); } finally { assert(/* ensures */); checkInvariants(); } } void checkInvariants() { assert(/* invariant */); } } อย่างไรก็ตามกระบวนทัศน์นี้ (หรือสิ่งที่คุณจะเรียกว่า) นำไปสู่ความยุ่งเหยิงของรหัสจำนวนมาก ฉันเริ่มสงสัยว่ามันคุ้มค่ากับความพยายามจริง …

3
ใช้การทดสอบหน่วยเพื่อบอกเล่าเรื่องราวความคิดที่ดีหรือไม่?
ดังนั้นฉันมีโมดูลการตรวจสอบสิทธิ์ที่ฉันเขียนเมื่อไม่นานมานี้ ตอนนี้ฉันเห็นข้อผิดพลาดในทางของฉันและเขียนการทดสอบหน่วยสำหรับมัน ในขณะที่เขียนการทดสอบหน่วยฉันมีช่วงเวลาที่ยากลำบากในการหาชื่อที่ดีและพื้นที่ที่ดีสำหรับการทดสอบ ตัวอย่างเช่นฉันมีสิ่งที่ชอบ RequiresLogin_should_redirect_when_not_logged_in RequiresLogin_should_pass_through_when_logged_in Login_should_work_when_given_proper_credentials โดยส่วนตัวฉันคิดว่ามันน่าเกลียดนิดหน่อยถึงแม้ว่ามันจะดูเหมือน "เหมาะสม" ก็ตาม ฉันยังมีปัญหาในการแยกความแตกต่างระหว่างการทดสอบโดยการสแกนพวกเขา (ฉันต้องอ่านชื่อวิธีการอย่างน้อยสองครั้งเพื่อทราบว่าล้มเหลวเพียงใด) ดังนั้นฉันคิดว่าอาจจะแทนที่จะเขียนแบบทดสอบที่ทดสอบการทำงานล้วนๆอาจจะเขียนชุดการทดสอบที่ครอบคลุมสถานการณ์ ตัวอย่างเช่นนี่คือส่วนทดสอบที่ฉันสร้างขึ้นด้วย: public class Authentication_Bill { public void Bill_has_no_account() { //assert username "bill" not in UserStore } public void Bill_attempts_to_post_comment_but_is_redirected_to_login() { //Calls RequiredLogin and should redirect to login page } public void Bill_creates_account() { //pretend the login page …

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

5
ฉันจะปรับปรุงการตรวจสอบและจัดการข้อผิดพลาดได้อย่างไร
เมื่อเร็ว ๆ นี้ฉันพยายามดิ้นรนที่จะเข้าใจว่าการตรวจสอบในปริมาณที่เหมาะสมคืออะไรและวิธีการที่เหมาะสมคืออะไร ฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้: เป็นวิธีที่เหมาะสมในการตรวจสอบข้อผิดพลาด (อินพุตไม่ดี, รัฐไม่ดี ฯลฯ ) คืออะไร? เป็นการดีกว่าที่จะตรวจสอบข้อผิดพลาดอย่างชัดเจนหรือใช้ฟังก์ชั่นเช่นการยืนยันที่สามารถปรับให้เหมาะสมกับโค้ดสุดท้ายของคุณ? ฉันรู้สึกเหมือนกำลังตรวจสอบโปรแกรมอย่างชัดเจนด้วยรหัสพิเศษจำนวนมากซึ่งไม่ควรถูกเรียกใช้ในสถานการณ์ส่วนใหญ่อย่างไรก็ตาม - และไม่พูดถึงข้อผิดพลาดส่วนใหญ่ที่จบลงด้วยความล้มเหลวในการยกเลิก / ออก เหตุใดจึงมีฟังก์ชั่นตรวจสอบอย่างชัดเจนว่าจะยกเลิกหรือไม่ ฉันได้มองหา asserts เทียบกับการตรวจสอบข้อผิดพลาดอย่างชัดเจนและพบว่ามีเพียงเล็กน้อยที่จะอธิบายอย่างแท้จริงเมื่อต้องทำเช่นกัน ส่วนใหญ่พูดว่า 'ใช้ข้อความยืนยันเพื่อตรวจสอบข้อผิดพลาดเชิงตรรกะและใช้การตรวจสอบอย่างชัดเจนเพื่อตรวจสอบความผิดพลาดอื่น ๆ ' ดูเหมือนว่าจะไม่ได้รับเราไปไกลมาก เราจะพูดว่าเป็นไปได้หรือไม่: Malloc returning null, check explictly API user inserting odd input for functions, use asserts สิ่งนี้จะทำให้ฉันดีขึ้นเมื่อตรวจสอบข้อผิดพลาดหรือไม่ ฉันจะทำอะไรได้อีก ฉันต้องการปรับปรุงและเขียนรหัส 'มืออาชีพ' ให้ดีขึ้น
13 c  testing  assertions 

6
QA มีบทบาทอย่างไรในโครงการ BDD
หากดำเนินโครงการโดยใช้ BDD ที่มีเนื้อหาครอบคลุม 100% ของเรื่องราวของผู้ใช้ด้วยการทดสอบการยอมรับอัตโนมัติสิ่งที่จะเป็นบทบาทของผู้ทดสอบ / ประกันคุณภาพ ฉันเดาว่าฉันจะจินตนาการว่านักพัฒนาจะเขียนการทดสอบการยอมรับร่วมกับเจ้าของผลิตภัณฑ์แจ้งให้เราทราบหากนั่นดูเหมือนว่าเป็นข้อสมมุติที่โง่เขลา

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