[C#] ทำ Unit Test กับ XML ครับ

หลายคนยังทำงานอยู่กับตัว XML เวลามีปรับแก้อะไร อาจจะเจอปัญหาว่า Version เก่า ถูก พอเพิ่มข้อมูลอะไรเข้ามาแล้วผิดได้ หนึ่งในทางที่ช่วยลดปัญหา คือ การลงทุนทำ Test จะได้ให้มันช่วยเตือนตอน Regression Test แล้ว มีอะไรแปลกๆ ครับ สำหรับตัว XML มันมี Library ที่ช่วยอยู่ครับ คือ ตัว XMLUnit มีทั้ง ฝั่ง DOTNET และ Java เลยครับ โดยใน Blog นี้ ผมจะเขียนในมุมของ DOTNET ครับ

Let's Test

- สร้าง Unit Test ขึ้นมา

ผมอิงตามหลัง 3A เลยครับ

  • Arrange - เตรียมข้อมูลสำหรับตั้งต้นให้พร้อม สร้าง Service / Data ครับ
  • Act - ให้ Code Under Test (Method ที่สนใจ สร้างไฟล์ XML ขึ้นมา)
String ActualFilePath = service.GenXml(DSETExpResult, XSDPath, "DS_" + DATASET_TYPE.SWA, DsetExportMessage);
  • Assert ตรวจได้หลายแบบครับ ของผมที่เอามาใช้ตรวจ XML 2 ตัว Actual / Expected นั้นตรงกัน หรือป่าว โดยใช้ตัว DiffBuilder ช่วยตรวจครับ Code Assert ที่ได้จะประมาณนี้ครับ
 String ExpectedFilePath = _BaseExportPath + "T67392_Exp_030DS_SWA20180521.xml";
 
//Compare 2 XML
 Diff d = DiffBuilder.Compare(Input.FromFile(ExpectedFilePath))
                     .WithTest(Input.FromFile(ActualFilePath)).Build();
 Assert.IsFalse(d.HasDifferences(), string.Join(Environment.NewLine + "Next Diff::", d.Differences.Select(r => r.Comparison.ToString())));
Case: Value ไม่เท่ากัน
Case: ที่ Node หาย อันนี้ Error ยาว อาจจะเจอในเคส
Case ที่ถูกต้องครับ

นอกจากตรวจว่า XML 2 ไฟล์ เหมือนกัน หรือไม่แล้ว ตัว XMLUnit ยังทำ

  • Asserting an XPath Value
Assert.That("<foo>bar</foo>", HasXPathConstraint.HasXPath("/foo"));
Assert.That("<foo>bar</foo>", EvaluateXPathConstraint.HasXPath("/foo/text()",Is.EqualTo("bar")));
  • Validating a Document กับ XML Schema ก็ได้ครับ
Validator v = Validator.ForLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.SchemaSources = new ISource[] {
        Input.FromUri("http://example.com/some.xsd").Build(),
        Input.FromFile("local.xsd").Build()
    };
ValidationResult result = v.ValidateInstance(Input.FromDocument(CreateDocument()).Build());
bool valid = result.Valid;
IEnumerable<ValidationProblem> problems = result.Problems;

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.