1. Trang chủ
  2. » Công Nghệ Thông Tin

Các giải pháp lập trình CSharp- P80 ppsx

10 203 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 2,63 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

A.4 Viết kiểm thử đơn vị với NUnit NUnit là bộ khung kiểm thử đơn vị được xây dựng cho .NET Framework, cho phép bạn viết các phương thức kiểm thử theo ngôn ngữ do bạn chọn để kiểm tra m

Trang 1

{

if (_instance == null)

{

_instance = new SingletonClass();

}

}

}

return _instance;

}

}

}

Hình A-3 Nạp template vào CodeSmith

CodeSmith tương đối dễ sử dụng và có thể sinh ra những kết quả tuyệt vời nếu được áp dụng

một cách đúng đắn Một trong những phần phổ biến nhất cần được sinh mã là tầng truy xuất

dữ liệu CodeSmith có một assembly đặc biệt với tên là SchemaExplorer, assembly này có thể

được sử dụng để sinh ra các template từ bảng, thủ tục tồn trữ, hay hầu như bất kỳ đối tượng

SQL Server nào khác.

CodeSmith được viết bởi Eric J Smith và có thể được download (bản dùng thử) tại

[ http://www.ericjsmith.net/codesmith/download.aspx ]

A.4 Viết kiểm thử đơn vị với NUnit

NUnit là bộ khung kiểm thử đơn vị được xây dựng cho NET Framework, cho phép bạn viết

các phương thức kiểm thử theo ngôn ngữ do bạn chọn để kiểm tra một hàm cụ thể của chương

Trang 2

trình Ứng dụng NUnit cung cấp một bộ khung để viết các kiểm thử đơn vị, cũng như một

giao diện đồ họa để chạy các kiểm thử đơn vị và xem kết quả

Ví dụ, chúng ta cần kiểm tra chức năng của lớp Hashtable trong NET Framework để xác định hai đối tượng có thể được thêm vào và lấy ra hay không Bước đầu tiên là tham chiếu đến

assembly NUnit.Framework để có thể truy xuất các thuộc tính và phương thức của bộ khung

NUnit Bước kế tiếp là tạo một lớp và đánh dấu nó với đặc tính [TestFixture] để NUnit biết lớp này có chứa phương thức kiểm thử

using System;

using System.Collections;

using NUnit.Framework;

namespace NUnitExample

{

[TestFixture]

public class HashtableTest {

public HashtableTest() {

}

}

}

Kế tiếp, chúng ta tạo một phương thức và đánh dấu nó với đặc tính [Test] để NUnit biết đây

là phương thức kiểm thử Trong phương thức này, chúng ta sẽ thiết lập một Hashtable và đưa vào đó hai giá trị, sau đó sử dụng phương thức Assert.AreEqual để xem chúng ta có thể thu lấy đúng các giá trị mà chúng ta đã đưa vào Hashtable hay không:

[Test]

public void HashtableAddTest()

{

Hashtable ht = new Hashtable();

ht.Add("Key1", "Value1");

ht.Add("Key2", "Value2");

Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!");

Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!");

}

Để chạy phương thức kiểm thử này, bạn cần tạo một dự án NUnit, mở assembly đã được sinh

ra bên trên và nhắp nút Run Hình A-4 cho thấy kết quả

Trang 3

kiểm thử, cũng như nhiều phương thức Assert, có thể được sử dụng để kiểm thử mọi phần trong mã lệnh của bạn

Một kiểm thử đơn vị có thể lưu và chạy lại mỗi khi bạn sửa đổi mã lệnh, điều này giúp bạn phát hiện lỗi dễ dàng hơn và đảm bảo phát triển ứng dụng tốt hơn

NUnit là một dự án mã nguồn mở và có thể được download tại [ http://www.nunit.org ]

Hình A-4 NUnit

Cũng có một bản add-in của NUnit cho Visual Studio NET, add-in này cho phép bạn trực tiếp chạy các phương thức kiểm thử đơn vị từ Visual Studio NET (có thể được download tại

[ http://sourceforge.net/projects/nunitaddin ])

Để có thêm thông tin về NUnit và vị trí của nó trong việc phát triển test-driven (vận hành theo kiểm thử), bạn hãy xem bài viết “Test-Driven C#: Improve the Design and Flexibility of Your

Project with Extreme Programming Techniques” trong đĩa CD đính kèm.

A.5 Kiểm soát mã lệnh với FxCop

.NET Framework rất mạnh, có nghĩa khả năng tạo ra những ứng dụng tuyệt vời là rất cao, nhưng khả năng tạo ra những chương trình tồi cũng là rất cao FxCop là một trong những

công cụ có thể được sử dụng để trợ giúp tạo ra những ứng dụng tốt hơn bằng việc cho phép

bạn khảo sát một assembly và kiểm tra tính tương thích của nó với một số quy luật FxCop chứa tập các quy luật do Microsoft tạo ra, nhưng bạn cũng có thể tạo ra những quy luật cho

mình Chẳng hạn, nếu muốn tất cả các lớp đều có một phương thức khởi dựng mặc định không đối số, bạn có thể viết một quy luật kiểm tra phương thức khởi dựng trên mỗi lớp của assembly Để có thêm thông tin về việc tạo những quy luật tùy biến, bạn hãy vào [ http://msdn.microsoft.com/msdnmag/issues/04/06/bugslayer ].

Ví dụ, chúng ta hãy xem FxCop phát hiện ra lỗi gì trong assembly NUnitExample (đã được trình bày mục A.4) Trước tiên, bạn cần tạo một dự án FxCop và đưa assembly này vào Sau

Trang 4

đó, bạn hãy nhấn Analyze, FxCop sẽ khảo sát assembly này và đưa ra các thông báo lỗi (xem

hình A-5)

FxCop nhận thấy một số vấn đề với assembly này Bạn có thể nhắp đúp lên một lỗi để xem

chi tiết, bao gồm lời mô tả quy luật và nơi mà bạn có thể tìm thấy nhiều thông tin hơn

FxCop có thể giúp bạn tạo mã lệnh tốt hơn, nhất quán hơn, nhưng nó không thể sửa chữa việc

thiết kế tồi hay lập trình kém FxCop cũng không phải là một sự thay thế cho việc kiểm tra mã lệnh (code review), nhưng vì nó có thể bắt nhiều lỗi trước khi kiểm tra mã lệnh nên bạn có thể

dành nhiều thời gian cho các vấn đề hệ trọng hơn là phải lo lắng về các quy ước đặt tên

Hình A-5 FxCop đưa ra các thông báo khi khảo sát NUnitExample

FxCop được phát triển bởi Microsoft và có thể được download tại

[ http://www.gotdotnet.com/team/fxcop ].

A.6 Khảo sát assembly với NET Reflector

.NET Reflector là một trình duyệt lớp (class browser) và trình dịch ngược (decompiler), nó có thể khảo sát một assembly và cho bạn thấy tất cả các “bí mật” trong đó .NET Framework đã đưa ra cơ chế phản chiếu (reflection) để khảo sát bất kỳ mã lệnh nào dựa-trên-.NET, cho dù nó

là một lớp đơn hay toàn bộ một assembly Cơ chế phản chiếu cũng có thể được sử dụng để thu lấy thông tin về các lớp, phương thức, và thuộc tính khác nhau trong một assembly nào đó Sử

Trang 5

thể khảo sát ngôn ngữ trung gian (Microsoft Intermediate LanguageMSIL) do các lớp và

phương thức này sinh ra, và bạn có thể dịch ngược các lớp và phương thức sang C# hay

Visual Basic NET.

Ví dụ, chúng ta sẽ sử dụng NET Reflector để khảo sát assembly NUnitExample (đã được trình bày ở mục A.4) Hình A-6 thể hiện assembly này khi được nạp vào NET Reflector Bên trong NET Reflector còn có những công cụ mà bạn có thể sử dụng để khảo sát thêm assembly này

Để xem MSIL của một phương thức, bạn hãy nhắp vào phương thức này và chọn

Disassembler.

Ngoài việc xem MSIL, bạn cũng có thể xem phương thức ở dạng C# bằng cách chọn

Decompiler từ trình đơn Tools Bạn cũng có thể xem phương thức này được dịch ngược sang Visual Basic NET hay Delphi bằng cách thay đổi tùy chọn trong trình đơn Languages Dưới đây là đoạn mã do NET Reflector sinh ra:

public void HashtableAddTest()

{

Hashtable hashtable1 = new Hashtable();

hashtable1.Add("Key1", "Value1");

hashtable1.Add("Key2", "Value2");

Assert.AreEqual("Value1", hashtable1["Key1"],

"Wrong object returned!");

Assert.AreEqual("Value2", hashtable1["Key2"],

"Wrong object returned!");

}

Trang 6

Hình A-6 Khảo sát NUnitExample với NET Reflector

Đoạn mã trên rất giống với đoạn mã mà chúng ta đã viết:

public void HashtableAddTest()

{

Hashtable ht = new Hashtable();

ht.Add("Key1", "Value1");

ht.Add("Key2", "Value2");

Assert.AreEqual("Value1", ht["Key1"],"Wrong object returned!");

Assert.AreEqual("Value2", ht["Key2"],"Wrong object returned!");

}

Mặc dù có một vài khác biệt nhỏ về mã lệnh nhưng chúng giống hệt nhau về chức năng

Công dụng hay nhất của NET Reflector là khảo sát các assembly và phương thức của NET

Framework .NET Framework cung cấp nhiều cách khác nhau để thực hiện các thao tác tương

tự nhau Ví dụ, nếu bạn cần đọc một tập dữ liệu từ XML, có nhiều cách khác nhau để thực

hiện điều này: sử dụng XmlDocument, XPathNavigator, hay XmlReader Bằng cách sử dụng

.NET Reflector, bạn có thể xem Microsoft đã sử dụng gì khi viết phương thức ReadXml của DataSet, hoặc họ đã làm gì khi đọc dữ liệu từ file cấu hình .NET Reflector cũng rất có ích khi tìm hiểu cách tạo các đối tượng như HttpHandlers; và qua đó, bạn biết được cách thức mà

nhóm phát triển của Microsoft đã xây dựng các đối tượng đó trong Framework.

.NET Reflector được viết bởi Lutz Roeder và có thể được download tại

[ http://www.aisto.com/roeder/dotnet ].

A.7 Lập tài liệu mã lệnh với NDoc

Việc lập tài liệu mã lệnh gần như là một công việc không mấy hứng thú Ở đây không nói về

tài liệu thiết kế mà là tài liệu cho từng phương thức và thuộc tính của lớp Công cụ NDoc sẽ sẽ

tự động sinh tài liệu cho mã lệnh của bạn bằng cách sử dụng cơ chế phản chiếu để khảo sát

assembly và sử dụng file XML được sinh từ các chú thích XML C# (các chú thích XML chỉ có hiệu lực cho C#, nhưng có một Visual Studio NET Power Toy với tên là VBCommenter cũng

sẽ thực hiện giống như vậy đối với Visual Basic NET).

Với NDoc, bạn vẫn cứ lập tài liệu cho mã lệnh, nhưng lập khi viết mã (trong các chú thích

XML) Bước đầu tiên khi sử dụng NDoc là mở chức năng sinh chú thích XML đối với

assembly của bạn Nhắp phải vào dự án và chọn Properties | Configuration Properties | Build, rồi nhập một đường dẫn để lưu file XML trong tùy chọn XML Documentation File (xem hình A-7) Khi dự án được tạo dựng, một file XML sẽ được sinh ra với tất cả các chú thích XML đi

kèm

Trang 7

Hình A-7 Chọn đường dẫn để lưu tài liệu XML

Dưới đây là phương thức ở mục A.4:

/// <summary>

/// This test adds a number of values to the Hashtable collection

/// and then retrieves those values and checks if they match.

/// </summary>

[Test]

public void HashtableAddTest()

{

// Phần thân phương thức ở đây.

}

Phần chú thích XML cho phương thức này sẽ được trích xuất và lưu thành file XML như sau:

<?xml version="1.0" ?>

<doc>

<assembly>

<name>NUnitExample</name>

</assembly>

<members>

<member name="M:NUnitExample.HashtableTest.HashtableAddTest">

<summary>This test adds a number of values to the Hashtable

collection and then retrieves those values and checks if

they match.

Trang 8

</summary>

</member>

</members>

</doc>

Bước kế tiếp là nạp assembly và file XML vào NDoc Sau đó, nhắp nút Build Documentation

để chạy quá trình sinh tài liệu (xem hình A-8) Hình A-9 là tài liệu CHM do NDoc sinh ra.

Hình A-8 NDoc

Trang 9

Hình A-9 Tài liệu CHM do NDoc sinh ra

NDoc là một dự án mã nguồn mở và có thể được download tại

[ http://ndoc.sourceforge.net ].

A.8 Tạo dựng giải pháp với NAnt

NAnt là một công cụ tạo dựng dựa-trên-.NET, giúp bạn viết một quy trình tạo dựng dự án cho

mình Khi có nhiều nhà phát triển cùng làm việc trên một dự án, bạn không thể phó thác việc tạo dựng cho từng người Bạn cũng không muốn phải thường xuyên tạo dựng dự án một cách

thủ công Thay vào đó, bạn viết một quy trình tạo dựng tự động chạy mỗi đêm NAnt cho phép bạn tạo dựng giải pháp, chép file, chạy các kiểm tra NUnit, gửi e-mail, và nhiều nữa Đáng tiếc, NAnt thiếu giao diện đồ họa, nhưng nó có một ứng dụng Console và các file XML chỉ định các tác vụ nào sẽ được hoàn thành trong quá trình tạo dựng Lưu ý rằng MSBuild, một nền tạo dựng mới trong trong phiên bản Visual Studio 2005, cũng có tính năng tương tự như

NAnt.

Ví dụ, chúng ta cần viết file tạo dựng NAnt cho dự án NUnitExample ở mục A.4 Trước tiên, bạn hãy tạo một file XML với phần mở rộng là build, và đặt nó trong thư mục gốc của dự án:

<?xml version="1.0"?>

<project name="NUnit Example" default="build" basedir=".">

<description>The NUnit Example Project</description>

<property name="debug" value="true"/>

<target name="build" description="compiles the source code">

<csc target="library" output=".\bin\debug\NUnitExample.dll"

debug="${debug}">

<references>

<includes name="C:\Program Files\NUnit 2.2\bin

\NUnit.Framework.dll" />

</references>

<sources>

<includes name="NUnitExample.cs"/>

Trang 10

</sources>

</csc>

</target>

</project>

Thẻ project được sử dụng để đặt tên cho dự án, target mặc định, và thư mục cơ sở Thẻ này cần có những thẻ con sau:

• Thẻ description được sử dụng để đặt một mô tả ngắn gọn về dự án

• Thẻ property được sử dụng để lưu trữ một thiết lập sao cho nó có thể được truy xuất từ bất cứ đâu trong file tạo dựng Ví dụ này tạo một thuộc tính với tên là debug, và thiết lập nó là true hay false tùy vào bạn có muốn dự án được biên dịch ở cấu hình gỡ rối hay không (thuộc tính này không ảnh hưởng gì đến cách thức tạo dựng dự án; nó chỉ là một biến số mà bạn có thể thiết lập và sẽ được thu về khi bạn thật sự xác định cách thức tạo dựng dự án)

• Kế tiếp là thẻ target Một dự án có thể có nhiều target (có thể được chỉ định khi NAnt chạy) Nếu không có target nào được chỉ định, target mặc định sẽ được sử dụng (ta đã thiết lập nó trong thẻ project) Trong ví dụ này, target mặc định là build Bên trong thẻ target, bạn cần thiết lập tên của target và mô tả những gì mà target này sẽ thực hiện Thẻ csc được sử dụng để chỉ định những gì sẽ được truyền cho trình biên dịch C# Trước tiên, bạn phải thiết lập target cho thẻ csc Do cần tạo file dll nên ví dụ này thiết lập target là library Kế tiếp, bạn phải thiết lập output cho thẻ csc, đây là nơi mà file

.dll sẽ được tạo Cuối cùng, bạn cần thiết lập thuộc tính debug, cho biết dự án có được

biên dịch ở chế độ gỡ rối hay không Vì đã tạo một thuộc tính trước đó để lưu trữ giá trị này, ta có thể sử dụng chuỗi ${debug} để truy xuất giá trị của thuộc tính

Thẻ csc cũng cần có các thẻ con: thẻ references cho biết những assembly nào cần được tham chiếu; và thẻ sources cho biết những file nào đi kèm Ví dụ này tham chiếu

đến assembly NUnit.Framework.dll và chứa file NUnitExample.cs

Để tạo dựng, bạn cần đến thư mục gốc của dự án và thực thi NAnt.exe ở đó (xem hình A-10) Nếu tạo dựng thành công, bạn có thể tìm thấy file các dll và pdb trong thư mục bin của dự

án

Ngày đăng: 08/07/2014, 17:20

HÌNH ẢNH LIÊN QUAN

Hình A-3 Nạp template vào CodeSmith - Các giải pháp lập trình CSharp- P80 ppsx
nh A-3 Nạp template vào CodeSmith (Trang 1)
Hình A-4 NUnit - Các giải pháp lập trình CSharp- P80 ppsx
nh A-4 NUnit (Trang 3)
Hình A-5 FxCop đưa ra các thông báo khi khảo sát NUnitExample - Các giải pháp lập trình CSharp- P80 ppsx
nh A-5 FxCop đưa ra các thông báo khi khảo sát NUnitExample (Trang 4)
Hình A-7 Chọn đường dẫn để lưu tài liệu XML - Các giải pháp lập trình CSharp- P80 ppsx
nh A-7 Chọn đường dẫn để lưu tài liệu XML (Trang 7)
Hình A-8 NDoc - Các giải pháp lập trình CSharp- P80 ppsx
nh A-8 NDoc (Trang 8)
Hình A-9 Tài liệu CHM do NDoc sinh ra - Các giải pháp lập trình CSharp- P80 ppsx
nh A-9 Tài liệu CHM do NDoc sinh ra (Trang 9)

TỪ KHÓA LIÊN QUAN