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

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

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

5
วิธีที่ดีที่สุดในการทดสอบหน่วยวิธีการที่เรียกวิธีการอื่น ๆ ในชั้นเรียนเดียวกัน
เมื่อเร็ว ๆ นี้ฉันได้พูดคุยกับเพื่อนบางคนซึ่งวิธีการ 2 วิธีต่อไปนี้ดีที่สุดในการส่งคืนผลลัพธ์หรือการโทรไปยังวิธีการในชั้นเรียนเดียวกันจากวิธีการในชั้นเรียนเดียวกัน นี่เป็นตัวอย่างที่ง่ายมาก ในความเป็นจริงฟังก์ชั่นมีความซับซ้อนมากขึ้น ตัวอย่าง: public class MyClass { public bool FunctionA() { return FunctionB() % 2 == 0; } protected int FunctionB() { return new Random().Next(); } } ดังนั้นเพื่อทดสอบสิ่งนี้เรามี 2 วิธี วิธีที่ 1: ใช้ฟังก์ชั่นและการกระทำเพื่อแทนที่ฟังก์ชั่นของวิธีการ ตัวอย่าง: public class MyClass { public Func<int> FunctionB { get; set; } …

6
ควรมีการทดสอบหน่วยสำหรับนิพจน์ปกติที่ซับซ้อนหรือไม่
ฉันควรเขียนการทดสอบหน่วยสำหรับนิพจน์ปกติที่ซับซ้อนในใบสมัครของฉันหรือไม่ ในอีกด้านหนึ่งพวกเขาทดสอบได้ง่ายเพราะรูปแบบอินพุตและเอาต์พุตมักจะง่ายและกำหนดไว้อย่างดีและพวกเขามักจะกลายเป็นความซับซ้อนดังนั้นการทดสอบของพวกเขาโดยเฉพาะมีค่า ในทางกลับกัน: พวกมันเองไม่ค่อยเป็นส่วนหนึ่งของส่วนต่อประสานของบางหน่วย อาจเป็นการดีกว่าที่จะทดสอบเฉพาะส่วนต่อประสานและดำเนินการทดสอบ regexes โดยปริยาย แก้ไข: ผมเห็นด้วยกับหมอสีน้ำตาลที่ของเขาในการแสดงความคิดเห็นหมายเหตุที่เป็นกรณีพิเศษนี้หน่วยทดสอบของชิ้นส่วนภายใน แต่เนื่องจากส่วนประกอบภายใน regexes มีคุณสมบัติพิเศษบางอย่าง: regex บรรทัดเดียวนั้นซับซ้อนจริงๆโดยไม่ต้องเป็นโมดูลแยกต่างหาก Regexes แม็พอินพุตกับเอาต์พุตโดยไม่มีผลข้างเคียงใด ๆ และง่ายต่อการทดสอบแยกต่างหาก

3
มีค่าจริงในการทดสอบหน่วยควบคุมใน ASP.NET MVC หรือไม่?
ฉันหวังว่าคำถามนี้จะให้คำตอบที่น่าสนใจเพราะเป็นคำถามที่ทำให้ฉันอึดใจ มีค่าจริงในการทดสอบหน่วยควบคุมใน ASP.NET MVC หรือไม่? สิ่งที่ฉันหมายถึงโดยส่วนใหญ่แล้ว (และฉันไม่มีอัจฉริยะ) วิธีการควบคุมของฉันคือแม้สิ่งที่ซับซ้อนที่สุดของพวกเขาเช่นนี้: public ActionResult Create(MyModel model) { // start error list var errors = new List<string>(); // check model state based on data annotations if(ModelState.IsValid) { // call a service method if(this._myService.CreateNew(model, Request.UserHostAddress, ref errors)) { // all is well, data is saved, // …

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

5
คุณควรเขียนโค้ดของคุณในทุกการทดสอบทุกหน่วยหรือไม่
บทเรียน / ตัวอย่างการทดสอบหน่วยการเรียนรู้ส่วนใหญ่มักจะเกี่ยวข้องกับการกำหนดข้อมูลที่จะทดสอบสำหรับการทดสอบแต่ละครั้ง ฉันเดาว่านี่เป็นส่วนหนึ่งของทฤษฎี "ทุกสิ่งที่ควรทดสอบในการแยก" อย่างไรก็ตามฉันพบว่าเมื่อต้องรับมือกับแอพพลิเคชั่นมัลติเทียร์ที่มีDIจำนวนมากรหัสที่จำเป็นสำหรับการตั้งค่าการทดสอบแต่ละครั้งจะยืดออกมาก แต่ฉันได้สร้างคลาส testbase จำนวนหนึ่งซึ่งตอนนี้ฉันสามารถสืบทอดซึ่งมีนั่งร้านทดสอบจำนวนมากที่สร้างไว้ล่วงหน้า เป็นส่วนหนึ่งของเรื่องนี้ฉันยังสร้างชุดข้อมูลปลอมซึ่งเป็นตัวแทนของฐานข้อมูลของแอปพลิเคชันที่กำลังทำงานแม้ว่าจะมีเพียงหนึ่งหรือสองแถวในแต่ละ "ตาราง" เป็นวิธีปฏิบัติที่ยอมรับได้หรือไม่หากไม่ใช่ทั้งหมดดังนั้นข้อมูลทดสอบส่วนใหญ่ในการทดสอบหน่วยทั้งหมดหรือไม่ ปรับปรุง จากความคิดเห็นด้านล่างจะรู้สึกว่าฉันทำการรวมมากกว่าการทดสอบหน่วย โครงการปัจจุบันของฉันคือ ASP.NET MVC โดยใช้หน่วยงานเหนือรหัส Framework ของ Entity ก่อนและ Moq สำหรับการทดสอบ ฉันเยาะเย้ย UoW และที่เก็บ แต่ฉันใช้คลาสตรรกะทางธุรกิจจริงและทดสอบการกระทำของคอนโทรลเลอร์ การทดสอบมักจะตรวจสอบว่า UoW ได้รับการมุ่งมั่นเช่น: [TestClass] public class SetupControllerTests : SetupControllerTestBase { [TestMethod] public void UserInvite_ExistingUser_DoesntInsertNewUser() { // Arrange var model = new Mandy.App.Models.Setup.UserInvite() …

2
การทดสอบหน่วย Guava สร้างขึ้นโดยอัตโนมัติอย่างไร
Guava มีกรณีทดสอบหน่วยสร้างขึ้นโดยอัตโนมัติ : Guava มีจำนวนยูนิตทดสอบที่มาก: ณ เดือนกรกฎาคม 2012 แพ็คเกจทดสอบ Guava มีมากกว่า 286,000 กรณีทดสอบรายบุคคล สิ่งเหล่านี้ส่วนใหญ่สร้างขึ้นโดยอัตโนมัติไม่ใช่เขียนด้วยมือ แต่ความครอบคลุมในการทดสอบของ Guava นั้นละเอียดมากโดยเฉพาะ com.google.common.collect มันถูกสร้างขึ้นมาได้อย่างไร? มีการใช้เทคนิคและเทคโนโลยีใดในการออกแบบและสร้างสิ่งเหล่านั้น

6
วิธีการอธิบายคุณค่าของการทดสอบหน่วย
ฉันต้องการแนะนำแนวคิดของการทดสอบหน่วย (และการทดสอบทั่วไป) กับเพื่อนร่วมงานของฉัน ตอนนี้ไม่มีการทดสอบเลยและสิ่งต่าง ๆ ถูกทดสอบโดยการปฏิบัติงานจริงผ่าน UI เพื่อดูผลลัพธ์ที่ต้องการ ดังที่คุณอาจจินตนาการได้ว่ารหัสนั้นมีความเชื่อมโยงอย่างแน่นแฟ้นกับการนำไปปฏิบัติที่แน่นอน - แม้จะทำให้เกิดโค้ดที่ควรอยู่ในคลาสและนำมาใช้ซ้ำในระบบที่ถูกคัดลอกและวางข้ามวิธีต่างๆ เนื่องจากความต้องการที่เปลี่ยนแปลงไปฉันถูกขอให้แก้ไขโมดูลที่ฉันเขียนไว้ก่อนหน้านี้และนั่นคือการรวมกันอย่างหลวม ๆ (ไม่มากเท่าที่ฉันต้องการ แต่ที่ดีที่สุดที่ฉันสามารถทำได้โดยไม่ต้องแนะนำแนวคิดอื่น ๆ มากมาย) ฉันตัดสินใจที่จะรวมชุดการทดสอบหน่วยกับรหัสที่แก้ไขแล้วของฉันเพื่อ "พิสูจน์" ว่าทำงานได้ตามที่คาดไว้และแสดงให้เห็นว่าการทดสอบทำงานอย่างไร ฉันไม่ได้ติดตาม TDD จริงเนื่องจากมีการเขียนโค้ดบางส่วนแล้ว แต่ฉันหวังว่าจะทำตามแนวคิด TDD บางอย่างสำหรับรหัสใหม่ที่ฉันจะต้องสร้าง ตอนนี้อย่างหลีกเลี่ยงไม่ได้ฉันแน่ใจว่าฉันจะถามว่าทำไมพาฉันมากกว่าหนึ่งหรือสองวันในการเขียนรหัสเนื่องจากส่วนหนึ่งของสิ่งที่ฉันจะโต้ตอบกับมีอยู่แล้วในระบบ (แม้ว่าจะไม่มีการทดสอบและแน่นมาก ประกอบ) และเมื่อฉันตรวจสอบรหัสในฉันจะถูกถามว่าโครงการ "การทดสอบ" นี้คืออะไร ฉันสามารถอธิบายพื้นฐานของการทดสอบได้ แต่ฉันไม่สามารถอธิบายถึงผลประโยชน์ที่แท้จริงในแบบที่คนอื่นจะเข้าใจได้ (เพราะพวกเขาคิดว่าการทดสอบต้องการให้คุณเรียกใช้แอปด้วยตัวเองเนื่องจากบ่อยครั้งที่ UI ที่แท้จริงมีความสำคัญ " หรือไม่). พวกเขาไม่เข้าใจความคิดที่จะมีเพศสัมพันธ์แบบหลวม ๆ (เห็นได้ชัดจากความจริงที่ว่าไม่มีอะไรที่เป็นคู่กันอย่างหลวม ๆ ไม่มีแม้แต่อินเตอร์เฟสใด ๆ นอกโค้ดที่ฉันเขียน) ดังนั้นการพยายามที่จะใช้สิ่งนั้นเพื่อเป็นผลประโยชน์อาจจะได้รับ "Huh?" ชนิดของรูปลักษณ์และอีกครั้งฉันไม่สามารถหลวมอย่างที่ฉันต้องการโดยไม่ต้องทำงานซ้ำหลายโมดูลที่มีอยู่และอาจแนะนำคอนเทนเนอร์ IoC …

5
การพัฒนาแบบทดสอบขับเคลื่อน - โน้มน้าวใจฉัน! [ปิด]
ฉันรู้ว่าบางคนเป็นผู้สนับสนุนขนาดใหญ่ของการพัฒนาขับเคลื่อนการทดสอบ ฉันเคยใช้การทดสอบหน่วยในอดีต แต่เพียงเพื่อทดสอบการปฏิบัติงานที่สามารถทดสอบได้ง่ายหรือที่ฉันเชื่อว่าอาจจะถูกต้อง เสร็จสิ้นหรือใกล้ครอบคลุมรหัสที่สมบูรณ์เสียงเหมือนมันจะใช้เวลา โครงการใดที่คุณใช้ในการพัฒนาโดยใช้การทดสอบ คุณใช้สำหรับโครงการที่มีขนาดใหญ่กว่านี้หรือไม่ ฉันควรจะใช้มันหรือไม่? โน้มน้าวใจฉัน!

6
การทดสอบหน่วยที่ควรคาดว่าผลลัพธ์จะ hardcoded?
ผลลัพธ์ที่คาดหวังจากการทดสอบหน่วยควรจะ hardcoded หรือพวกเขาสามารถขึ้นอยู่กับตัวแปรเริ่มต้น? ผลที่ได้จากฮาร์ดโค้ดหรือจากการคำนวณเพิ่มความเสี่ยงในการแนะนำข้อผิดพลาดในการทดสอบหน่วยหรือไม่? มีปัจจัยอื่น ๆ ที่ฉันไม่ได้พิจารณาหรือไม่? ตัวอย่างเช่นรูปแบบใดในสองรูปแบบที่เชื่อถือได้มากขึ้น [TestMethod] public void GetPath_Hardcoded() { MyClass target = new MyClass("fields", "that later", "determine", "a folder"); string expected = "C:\\Output Folder\\fields\\that later\\determine\\a folder"; string actual = target.GetPath(); Assert.AreEqual(expected, actual, "GetPath should return a full directory path based on its fields."); } [TestMethod] public …
29 c#  unit-testing 

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

7
การทดสอบหน่วยอัตโนมัติการทดสอบการรวมหรือการทดสอบการยอมรับ [ปิด]
การทดสอบ TDD และการทดสอบหน่วยดูเหมือนจะคลั่งมากในขณะนี้ แต่มันมีประโยชน์จริง ๆ เมื่อเทียบกับการทดสอบอัตโนมัติรูปแบบอื่นหรือไม่ ฉันเดาว่าการทดสอบการรวมอัตโนมัตินั้นมีประโยชน์มากกว่าการทดสอบเครื่อง จากประสบการณ์ของฉันข้อผิดพลาดส่วนใหญ่ดูเหมือนว่าจะอยู่ในการโต้ตอบระหว่างโมดูลและไม่มากตรรกะ (ปกติ จำกัด ) ของแต่ละหน่วย การถดถอยยังเกิดขึ้นบ่อยครั้งเนื่องจากการเปลี่ยนแปลงส่วนต่อประสานระหว่างโมดูล (และเปลี่ยนก่อนและหลังเงื่อนไข) ฉันเข้าใจอะไรผิดพลาดหรือทำไมการทดสอบหน่วยได้รับความสนใจมากเมื่อเทียบกับการทดสอบการรวมระบบ เป็นเพียงเพราะการสันนิษฐานว่าการทดสอบการรวมเป็นสิ่งที่คุณมีและการทดสอบหน่วยเป็นสิ่งต่อไปที่เราต้องเรียนรู้ที่จะใช้ในฐานะนักพัฒนา หรือการทดสอบหน่วยอาจให้ผลตอบแทนสูงสุดเมื่อเทียบกับความซับซ้อนของการทำให้เป็นอัตโนมัติ? คุณมีประสบการณ์อย่างไรกับการทดสอบหน่วยอัตโนมัติการทดสอบการรวมอัตโนมัติและการทดสอบการยอมรับอัตโนมัติและจากประสบการณ์ของคุณสิ่งที่ให้ผลตอบแทนการลงทุนสูงสุด และทำไม? หากคุณต้องเลือกการทดสอบเพียงรูปแบบเดียวเพื่อให้เป็นอัตโนมัติในโครงการถัดไปของคุณ ขอบคุณล่วงหน้า.

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

6
ความรู้สึกของการทดสอบหน่วยโดยไม่ต้อง TDD
เรามีโครงการใหม่ (ค่อนข้างใหญ่) เริ่มต้นที่เราวางแผนที่จะพัฒนาโดยใช้ TDD แนวคิดของ TDD ล้มเหลว (ด้วยเหตุผลทางธุรกิจและไม่ใช่ธุรกิจ) แต่ตอนนี้เรามีการสนทนาเราควรจะเขียนบททดสอบต่อไปหรือไม่ เพื่อนของฉันบอกว่าไม่มีความรู้สึก (หรือใกล้ถึงศูนย์) ในการเขียนการทดสอบหน่วยที่ไม่มี TDD เราควรเน้นเฉพาะการทดสอบการรวมเข้าด้วยกัน ฉันเชื่อว่าตรงกันข้ามว่ายังมีความรู้สึกบางอย่างในการเขียนการทดสอบหน่วยธรรมดาเพียงเพื่อให้รหัสในอนาคตมากขึ้น คุณคิดอย่างไร? เพิ่มเติม: ฉันคิดว่านี่ไม่ใช่คำถามที่ซ้ำกัน>> คำถามนี้ << - ฉันเข้าใจความแตกต่างระหว่าง UT และ TDD คำถามของฉันไม่เกี่ยวกับความแตกต่างแต่เกี่ยวกับความรู้สึกในการเขียนการทดสอบหน่วยที่ไม่มี TDD
28 unit-testing  tdd 

2
การทดสอบหน่วยถือว่ามีความเปราะหรือไม่ถ้ามันล้มเหลวเมื่อตรรกะทางธุรกิจเปลี่ยนไป?
โปรดดูรหัสด้านล่าง; มันทดสอบเพื่อดูว่าบุคคลที่มีเพศหญิงมีสิทธิ์ได้รับข้อเสนอ 1: [Fact] public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale() { var personId = Guid.NewGuid(); var gender = "F"; var person = new Person(personId, gender); var id = Guid.NewGuid(); var offer1 = new Offer1(id,"Offer1"); Assert.False(offer1.IsEligible(person)); } การทดสอบหน่วยนี้สำเร็จ อย่างไรก็ตามจะล้มเหลวหากมีการเสนอ 'Offer1' ให้กับสตรีในอนาคต เป็นที่ยอมรับหรือไม่ - ถ้าตรรกะทางธุรกิจโดยรอบเสนอ 1 การเปลี่ยนแปลงการทดสอบหน่วยจะต้องเปลี่ยน โปรดทราบว่าในบางกรณี (สำหรับข้อเสนอบางอย่าง) ตรรกะทางธุรกิจจะเปลี่ยนไปในฐานข้อมูลเช่นนี้: update Offers set Gender='M' where …

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