262
Phân công: Hvà tên Công vic Nguyễn Văn Tập (Nhóm trưởng) Code demo chương trình Trnh Thanh Sang Quay Video Võ ThCm Ngân Son bài báo cáo Dương Thị Ngc Giàu Son slide báo cáo Nguyn ThPhượng Hng Son các câu hi cng cMC LC I. Gii Thiu ............................................................................................................................................ 2 1. Gii thiu vnamespace System.xml (introduction to namespace System.xml) ............................ 2 2. Đọc và Ghi XML (Read and write Streamed XML)............................................................................. 4 2.1 Sdng lp XmlTexReader .......................................................................................................... 4 2.2 Các phương thức Read.................................................................................................................... 6 2.3 Lấy thuộc tính của dữ liệu: ............................................................................................................. 7 2.4 Sử dụng lớp XmlValidatingReader ................................................................................................ 8 2.5 Sử dụng Schema property .............................................................................................................. 9 2.6 Sử dụng lớp XmlTextWriter .......................................................................................................... 9 II. Hướng dẫn làm demo Chương trình kết nối C dng ile hình ......................... 11 Bước 1: To project mi có tên là DemoKetNoiSQL..................................................................... 11 Bước 2: Tao form với các control như hình bên dưới..................................................................... 11 Bước 3: Tạo file xml trong thư mục debug của chương trình. ........................................................ 12 Bước 4: Thêm class DataProvide vào chương như hình bên dưới:................................................. 13 Bước 5:Tạo thêm class SQLInformation ........................................................................................ 16 Bước 6: Ta viết các hàm skin cho form ..................................................................................... 17 Bước 7: Vào SQL to một cơ sở dliu tên là QLBH vy là chúng ta có thkết ni thành công. 20 III. Câu hi ........................................................................................................................................... 20 1. Câu hi Thc hành: ......................................................................................................................... 20 2. Câu hi lý thuyết: ............................................................................................................................ 20 3. Câu hỏi trắc nghiệm ........................................................................................................................ 21

Hướng dẫn lập trình quản lý c#

Embed Size (px)

Citation preview

Page 1: Hướng dẫn lập trình quản lý c#

Phân công:

Họ và tên Công việc

Nguyễn Văn Tập (Nhóm trưởng) Code demo chương trình

Trịnh Thanh Sang Quay Video

Võ Thị Cẩm Ngân Soạn bài báo cáo

Dương Thị Ngọc Giàu Soạn slide báo cáo

Nguyễn Thị Phượng Hằng Soạn các câu hỏi củng cố

MỤC LỤC

I. Giới Thiệu ............................................................................................................................................ 2

1. Giới thiệu về namespace System.xml (introduction to namespace System.xml) ............................ 2

2. Đọc và Ghi XML (Read and write Streamed XML)............................................................................. 4

2.1 Sử dụng lớp XmlTexReader .......................................................................................................... 4

2.2 Các phương thức Read .................................................................................................................... 6

2.3 Lấy thuộc tính của dữ liệu: ............................................................................................................. 7

2.4 Sử dụng lớp XmlValidatingReader ................................................................................................ 8

2.5 Sử dụng Schema property .............................................................................................................. 9

2.6 Sử dụng lớp XmlTextWriter .......................................................................................................... 9

II. Hướng dẫn làm demo Chương trình kết nối C d ng ile hình ......................... 11

Bước 1: Tạo project mới có tên là DemoKetNoiSQL ..................................................................... 11

Bước 2: Tao form với các control như hình bên dưới ..................................................................... 11

Bước 3: Tạo file xml trong thư mục debug của chương trình. ........................................................ 12

Bước 4: Thêm class DataProvide vào chương như hình bên dưới:................................................. 13

Bước 5:Tạo thêm class SQLInformation ........................................................................................ 16

Bước 6: Ta viết các hàm sự kiện cho form ..................................................................................... 17

Bước 7: Vào SQL tạo một cơ sở dữ liệu tên là QLBH vậy là chúng ta có thể kết nối thành công. 20

III. Câu hỏi ........................................................................................................................................... 20

1. Câu hỏi Thực hành: ......................................................................................................................... 20

2. Câu hỏi lý thuyết: ............................................................................................................................ 20

3. Câu hỏi trắc nghiệm ........................................................................................................................ 21

Page 2: Hướng dẫn lập trình quản lý c#

I. Giới Thiệu

XML (eXtensible Markup Langue) đóng một vai trò quan trọng trong .NET. Không chỉ

vì .NET cho phép bạn sử dụng XML trong các ứng dụng của bạn, mà bản thân nó cũng sử dụng

XML cho những file cấu hình và tài liệu mã nguồn, như SOAP, các dịch vụ web và Ado.net. Do

đó tìm hiểu về các xử lý XML trong .Net với ngôn ngữ C# là một điều nên làm. Bài viết này

1. Giới thiệu về namespace System.xml (introduction to namespace System.xml)

- namespace System.xml trong .NET cung cấp một số lớp hỗ trợ cho việc xử lý XML.

Dưới đây là những lớp đọc và ghi XML.

Tên lớp Giải thích

XmlReader

Một lớp đọc trừu tượng nhanh và non-cached dữ liệu XML.

XmlReader được thiết kế giống như bộ phân tách SAX.

XmlWriter

Một lớp viết trừu tượng nhanh và non-cached dữ liệu XML trong

một dòng hoặc định dạng file.

XmlTexReader

Mở rộng của XmlReader. Cung cấp chuỗi truy cập nhanh dữ liệu

XML.

XmlTexWriter Mở rộng của XmlWriter. Phát nhanh các dòng XML.

Page 3: Hướng dẫn lập trình quản lý c#

- Một vài lớp hữu ích khác trong XML:

Tên lớp Giải thích

XmlNode

Một lớp trừu tượng miêu tả một nút đơn trong một tài liệu XML.

Lớp cơ sở cho các lớp khác trong namespace XML.

XmlDocument

Mở rộng của XmlNode. Đây là một thực thi W3C Document

Object Model (DOM). Nó cung cấp một cây miêu tả tài liệu

XML trong bộ nhớ cho phép điều hướng và soạn thảo.

XmlDataDocument

Mở rộng của XmlDocument. Đây là một tài liệu có thể được tải

từ dữ liệu XML hoặc từ dữ liệu trong một ADO.NET DataSet.

Cho phép hòa trộn XML và dữ liệu quan hệ trong cùng một

view.

XmlResolver

Một lớp trừu tượng dùng giải quyết các tài nguyên XML ngoài

như DTD và tham chiếu sơ đồ. Cũng dùng để xử lí các thành

phần <xsl:include> và <xsl:import>.

XmlUrlResolver

Mở rộng của XmlResolver. Giải quyết các tài nguyên tên như

một URI (Uniform Resource Identifier).

- Lưu ý: namespace xml có sẵn cho bất kỳ ngôn ngữ nào biết .NET

Page 4: Hướng dẫn lập trình quản lý c#

2. Đọc và Ghi XML (Read and write Streamed XML)

- Cả 2 lớp XmlReader và XmlWriter đều là những lớp

trừu tượng. Hình dưới đây minh họa các lớp kế thừa từ 2

lớp này:

+ XmlTextReader và XmlTextWriter làm việc chung trên

các đối tượng stream hoặc các đối tượng

TextReader/TextWriter trong namespace System.IO.

+ XmlNodeReader sử dụng XmlNode cho một nguồn

thay cho một stream. XmlValidatingReader thêm DTD

với sơ đồ tích hợp và tất nhiên là cả dữ liệu hợp lệ.

2.1 Sử dụng lớp XmlTexReader

- XmlTexReader rất giống SAX. Một trong những khác biệt lớn nhất: SAX là một mô

hình kiểu push, còn XmlTextReader là một mô hình pull, ở đó dữ liệu được kéo vào ứng dụng

yêu cầu nó. Nó tạo ra một mô hình lập trình dễ dàng và trực quan hơn. Một lợi ích khác của mô

hình pull là có thể lựa chọn dữ liệu để gởi đến ứng dụng: nếu bạn không muốn tất cả các dữ liệu,

vì không cần xử lý tất cả chúng. Còn trong mô hình push, tất cả dữ liệu XML cần phải được xử

lý bởi ứng dụng, mặc cho nó có muốn hay không.

- Để sử dụng lớp này bạn cần khai báo :

using System.Xml;

- Bây giờ hãy mở visual studio của bạn lên:

+ Kéo vào một ListBox và một Button như

hình bên;

+ Sau đó viết sự kiện cho button Load XML

như sau:

Page 5: Hướng dẫn lập trình quản lý c#

- Kết quả khi chạy chương trình trên và click vào button LoadXML như hình bên dưới.

- XmlTextReader này sử dụng khá đơn giản.

+ Trước tiên chúng ta tạo ra một đối tượng string chứa dường dẫn tới file xml.

Sau đó tạo một đối tượng XmlTextReader mới với tham số là đường dẫn tới file xml.

+ Khi chương trình chạy đến vòng lặp while, phương thức Read sẽ được di

chuyển sang mục tiêu đầu tiên trong tài liệu. Nó tiêu biểu cho các mục khai báo XML.

Page 6: Hướng dẫn lập trình quản lý c#

Trong ví dụ này, chúng ta duyệt qua từng mục và so sánh xtr.NodeType với bộ

XmlNodeType, và thêm các mục được tìm thấy vào listbox.

2.2 Các phương thức Read

- Có một vài cách di chuyển trong tài liệu. Như bạn đã thấy trong ví dụ trên,

Read() có thể di chuyển sang mục tiếp theo. Chúng ta có thể xem nêu mục đó có giá trị

(HasValue()) , hoặc nếu mục đó có thuộc tính (HasAttributes()) . Chúng ta cũng có thể

dùng phương thức ReadStartElement(), để kiểm tra xem nếu mục hiện tại là thành phần

khởi đầu, và chuyển sang mục tiếp theo. Nếu không phải là mục khởi đầu một ngoại lệ

XmlException sẽ được phát ra. Việc gọi phương thức này giống như gọi phương thức

IsStartElement(), bởi một Read().

- Các phương thức ReadString() và ReadChars() đều đọc dữ liệu văn bản từ một

thành tố. ReadString() tra về một chuỗi dữ liệu, trong khi ReadChars() trả về một mảng

dữ liệu kiểu char.

- ReadElementString() cũng giống như ReadString(), ngoại trừ việc bạn không

phải truyền tên của một thành tố. Nếu nội dung của mục tiếp theo không phải là một start

tag, hoặc nếu tham số Name không không phải là Name của mục hiện hành, thì một

ngoại lệ sẽ được phát ra.

- Dưới đây là ví dụ chỉ ra cách sử dụng ReadElementString(), lưu ý khai báo:

1. using System.IO;

2. private void btnLoadXML_Click(object sender, EventArgs e)

3. {

4. string fileName = “Book.xml”;

5. FileStream fs = new FileStream(fileName, FileMode.Open);

6. XmlTextReader xtr = new XmlTextReader(fs);

7. while (!xtr.EOF)

8. {

9. if (xtr.MoveToContent() == XmlNodeType.Element && xtr.Name == “title”)

10. {

11. listBox1.Items.Add(xtr.ReadElementString());

12. }

13. Else

Page 7: Hướng dẫn lập trình quản lý c#

14. {

15. xtr.Read();

16. }

17. }

18. }

- Trong vòng lặp while chúng ta sử dụng MoveToContent() để tìm trên mỗi dòng

xem XmlNodeType.Element có giống với named title không. Chúng ta sử dụng thuộc

tính EOF của XmlTextReader như là một điều kiện lặp. Nếu mục không phải kiểu

Element của named title, mệnh đề else phát ra một phương thức Read() để di chuyển sang

mục tiếp theo. Khi chúng ta tìm thấy một mục thỏa điều kiện, chúng ta trả kết quả của

ReadElementString() cho listbox. Nó cho phép các tựa sách được liệt kê trong listbox.

Chú ý rằng chúng ta không tạo ra một lời gọi Read() sau khi một ReadElementString()

thực hiện thành công. Bởi vì ReadElementString() cũng sẽ di chuyển sang mục tiếp theo.

- Nếu bạn bỏ && tr.Name==”title” trong mệnh đề if, bạn sẽ nhận được ngoại lệ

XmlException. Nếu nhìn vào file dữ liệu, bạn sẽ thấy thành tố đầu tiên mà

MoveToContent() tìm ra là <bookstore>. Tất nhiên nó vì nó không chứa một kiểu text

chuẩn, nên ReadElementString() phát ra một ngoại lệ XmlException.

2.3 Lấy thuộc tính của dữ liệu:

- Khi bạn chạy các ví dụ trên, bạn nhận ra rằng khi các mục được đọc, bạn không

thấy bất kì thuộc tính nào cả. Đó là vì các thuộc tính không nằm trong tài liệu. Khi đang

đứng trên một mục, bạn có thể kiểm tra các thuộc

tính và có thể lấy giá trị của bất kì giá trị thuộc tính

nào.

- Thuộc tính HasAttributes sẽ trả về giá trị

true nếu có bất kì thuộc tính nào còn không sẽ trả về

false. Thuộc tính AttributeCount sẽ cho bạn biết có

bao nhiêu thuộc tính, và phương thức GetAttribute()

sẽ trả về một thuộc tính thông qua tên hoặc chỉ mục.

Nếu bạn muốn lặp qua các thuộc tính bạn có thể

dùng các phương thức MoveToFirstAttribute() và MoveToNextAttribute().

- Dưới đây là một ví dụ về việc lặp qua các thuộc tính.

1.string fileName = “Book.xml”;

Page 8: Hướng dẫn lập trình quản lý c#

2.FileStream fs = new FileStream(fileName, FileMode.Open);

3.XmlTextReader xtr = new XmlTextReader(fs);

4.while (xtr.Read())

5.{

6.if (xtr.NodeType == XmlNodeType.Element)

7.{

8.for (int i = 0; i < xtr.AttributeCount; i++)

9.{

10. listBox1.Items.Add(xtr.GetAttribute(i));

11. }

12. }

13. }

- Bây giờ chúng ta xem xét về các mục thành phần. Khi chúng ta tìm thấy một

mục, chúng ta lặp qua tất cả thuộc tính của nó, và dùng phương thức GetAttribute() để

load giá trị của thuộc tính vào listbox. Trong ví dụ này các thuộc tính đó là genre,

publicationdate, và ISBN.

2.4 Sử dụng lớp XmlValidatingReader

- Nếu bạn muốn xác nhận một tài liệu XML, bạn sẽ cần phải sử dụng lớp

XmlValidatingReader. Nó chứac các khả năng giống như XmlTextReader (Cả hai đều xuất phát

từ XmlReader) nhưng XmlValidatingReader có thêm thuộc tính ValidationType, thuộc tính

Schemas và SchemaType.

- Nếu bạn gán thuộc tính ValidationType giá trị xác nhận mà bạn muốn. Giá trị hợp lệ

của thuộc tính này được liệt kê trong bảng sau:

Property

value Description

Auto

Nếu một DTD được khai báo trong một khai báo <!DOCTYPE…>, điều

này cho phép DTD sẽ được load và xử lí. Giá trị mặc định cho các

DTD.Nếu một thuộc tính XSD schemalocation được tìm thấy, XSD được

load và xử lí, và sẽ trả về các giá trị mặc định trong sơ đồ.

Nếu một không gian tên với tiếp đầu ngữ MSXML x-schema được tìm

thấy, nó sẽ load và xử lí sơ đồ XDR và trả về các thuộc tính mặc định đã

Page 9: Hướng dẫn lập trình quản lý c#

được định nghĩa.

DTD Phù hợp theo chuẩn DTD.

Schema Phù hợp theo sơ đồ XSD.

XDR Phù hợp theo sơ đồ XDR

None Không giá trị hợp lệ nào được thực thi.

- Khi một thuộc tính trong này được chọn, Một ValidationEventHandler cần phải được gán. Đây

là một sự kiện được tạo ra do các lỗi. Bạn có thể tác động lại lỗi theo các mà bạn cho là phù hợp.

2.5 Sử dụng Schema property

Schemas property của XmlValidatingReader chứa một XmlSchemaCollection, có

thể tìm thấy trong không gian tên System.Xml.Schema. Tập hợp này tổ chức load lại

loaded XSD và XDR schemas. Nó cực nhanh đặc biệc là khi bạn cần kiểm tra sự hợp lệ

của nhiều tài liệu khác nhau, vì sơ đồ sẽ không được load mỗi khi kiểm tra. Các bước sử

dụng thuộc tính này như sau, bạn tạo một đối tượng XmlSchemaCollection. Phương thức

Add(), nằm trong một XmlSchemaCollection, có bốn quá tải. Bạn có thể truyền nó cho

một đối tượng xuất phát từ XmlSchema, một đối tượng xuất phát từ

XmlSchemaCollection, một chuỗi không gian tên với chuỗi URI của file sơ đồ và một đối

tượng xuất phát từ XmlReader chứa trong sơ đồ.

2.6 Sử dụng lớp XmlTextWriter

- Lớp XmlTextWriter cho phép bạn xuất XML thành một chuỗi, một file hoặc

một đối tượng a TextWriter. Giống như XmlTextReader, nó là một kiểu forward-only,

non-cached. XmlTextWriter có thể cấu hình cao, cho phép bạn chỉ rõ những thứ như cho

phép thục đầu dòng, số thục đầu dòng, kí tự chỉ dẫn nào được dùng trong các giá trị thuộc

tính cho phép namespace hỗ trợ.

- Hãy xem ví dụ sau, để biết cách sử dụng lớp XmlTextWriter

1. private void btnGhiXML_Click(object sender, EventArgs e)

2. {

3. SaveFileDialog sfd = new SaveFileDialog();

4. sfd.Filter = "XML file(*.xml)|*.xml";

5. sfd.RestoreDirectory = true;\

Page 10: Hướng dẫn lập trình quản lý c#

6. if (sfd.ShowDialog() == DialogResult.OK)

7. {

8. XmlTextWriter xtw = new XmlTextWriter(sfd.FileName, null);

9. xtw.Formatting = Formatting.Indented;

10. xtw.WriteStartDocument();

11. // write to element HoTen

12. xtw.WriteStartElement("LyLich");

13. xtw.WriteAttributeString("QuocTich", "Viet Nam");

14. xtw.WriteElementString("HoTen", txtHoTen.Text);

15. xtw.WriteElementString("QueQuan", txtQueQuan.Text);

16. xtw.WriteElementString("NgaySinh", txtNgaySinh.Text);

17. xtw.WriteEndElement();

18. xtw.WriteEndDocument();

19. xtw.Flush();

20. xtw.Close();

21. }

22. }

- Chương trình demo có

giao diện như sau:

Khi nhấn button ghi ra file XML

thì hộp thoại saveFileDialog sẽ hiện ra

để bạn chọn đường dẫn lưu file. Bạn

điền tên file rồi sau đó chọn save thì file

sẽ lưu lại với đuôi mở rộng là .xml với

tên mà bạn đã đặt cho nó.

Sau đó bạn click chuột phải vào

file xml vừa được tạo ra chọn Edit thì sẽ

thấy nội dung mà chương trình đã ghi ra.

- Các thành phần được điều khiển bằng việc theo dõi khi nào bạn bắt đầu và kết thúc thao

tác viết các thành phần các thuộc tính. Bạn có thể bắt gặp chúng khi chúng ta thêm vào tên của

thành phần con cho các thành phần lớn. Chú ý việc các lời gọi phương thức WriteStartElement()

và WriteEndElement() được tổ chức như thế nào và các tổ chức các sản phẩm các bộ thành phần

trong file xuất.

- Các phương thức WriteElementString() và WriteAttributeString(), có một vài phương

thức ghi đặc biệc. WriteCData() sẽ xuất ra một đoạn CData (<!CDATA[...]]>), việc xuất ra các

text cần một tham số. WriteComment() xuất ra một ghi chú theo định dạng XML. WriteChars()

xuất ghi chi của của một chuỗi các kí tự. Điều này cũng tương tự phương thức ReadChars() mà

Page 11: Hướng dẫn lập trình quản lý c#

chúng ta đã biết; chúng đều sử dụng cùng các tham số. WriteChars() cần một vùng đệm (một

mảng kí tự) Vị trí bắt đầu đẻ ghi (một số integer) số các kí tự sẽ ghi (một số integer).

- Thao tác đọc và ghi XML dùng các lớp xuất phát từ XmlReader và XmlWriter đơn giản

và mềm dẻo đến hơn chúng ta tưởng tượng rất nhiều.

II. Hướng dẫn làm demo Chương trình kết nối C d ng ile hình

XML

Bước 1: Tạo project mới có tên là DemoKetNoiSQL

Bước 2: Tao form với các control như hình bên dưới

Combobox

Name: cbserver

na

Textbox

Name: txtUser,txtPass

Listbox

Name:

listBox1

Các button

chức năng

Page 12: Hướng dẫn lập trình quản lý c#

Bước 3: Tạo file xml trong thư mục debug của chương trình.

Tạo file notpad++ trong đó ghi các dòng sau:

1. <?xml version="1.0"?>

2. <cauhinh>

3. <servername>ADMIN\SQLEXPRESS</servername>

4. <database>QLBH</database>

5. <username>sa</username>

6. <password>sql2008</password>

7. <connectStr>Data Source=ADMIN\SQLEXPRESS; Initial Catalog =QLBH;

Integrated Security=SSPI;</connectStr>

8. </cauhinh>

Khi save as ta chọn đến thư mục debug của chương trình và phần mở rộng của nó ta để là

.xml. Cuối cùng ta được như hình bên dưới

Page 13: Hướng dẫn lập trình quản lý c#

Bước 4: Thêm class DataProvide vào chương như hình bên dưới:

Trong class này, đầu tiên tạo là lớp DataProvide sẽ kết thừa lớp DataTable:

1. class DataProvide : DataTable

Trong lớp DataProvide có các thuộc tính như:

1. public static string m_ConnectString;

2. private static SqlConnection m_Connection;

3. private SqlCommand m_Command;

4. private SqlDataAdapter m_DataAdapter;

Tiếp theo, tạo các hàm lấy dữ liệu cho thuộc tính:

1. public static SqlConnection Connection

2. { get { return m_Connection; } }

3. public SqlCommand SqlCmd

4. {

5. get { return m_Command; }

6. set { m_Command = value; }

7. }

8. public void CloseConnetion()

9. {

10. m_Connection.Close();

11. }

Page 14: Hướng dẫn lập trình quản lý c#

Tiếp theo trong class này tạo thêm các hàm mở, đóng kết nối,…

1. public bool OpenConnection()

2. {

3. try

4. {

5. if (m_Connection == null)

6. m_Connection = new SqlConnection(m_ConnectString);

7. if (m_Connection.State == ConnectionState.Closed)

8. m_Connection.Open();

9. return true;

10. }

11. catch (Exception e)

12. {

13. m_Connection.Close();

14. MessageBox.Show(e.Message);

15. return false;

16. }

17. }

18. public void CloseConnetion()

19. {

20. m_Connection.Close();

21. }

22. public DataProvide()

23. {

24. string patch = Application.StartupPath + "\\cauhinh.xml";

25. DocFileCauHinh(patch);

26. }

Page 15: Hướng dẫn lập trình quản lý c#

Sau cùng trong class này tạo 2 hàm đó là hàm Load() và hàm DocFileCauHinh()

1. public void Load(SqlCommand cmd)

2. {

3. m_Command = cmd;

4. try

5. {

6. this.Clear();

7. m_Command.Connection = m_Connection;

8. m_DataAdapter = new SqlDataAdapter();

9. m_DataAdapter.SelectCommand = m_Command;

10. m_DataAdapter.Fill(this);

11. }

12. catch (Exception e)

13. {

14. MessageBox.Show(e.Message);

15. }

16. }

17. public static void DocFileCauHinh(string patch)

18. {

19. XmlTextReader reader = new XmlTextReader(patch);

20. reader.MoveToElement();

21. while (reader.Read())

22. {

23. if (reader.NodeType == XmlNodeType.Element && reader.Name

== "cauhinh")

24. {

25. while (reader.Read())

26. {

27. if (reader.NodeType == XmlNodeType.Element &&

reader.Name == "connectStr")

28. {

29. 30. DataProvide.m_ConnectString = reader.ReadString();

31. break;

32. }

33. }

34. }

35. }

Page 16: Hướng dẫn lập trình quản lý c#

Bước 5:Tạo thêm class SQLInformation

Trong class SQLInformation này ta code như sau:

1. public static string m_SQLServer;

2. public static string m_Username;

3. public static string m_Password;

4. public ArrayList GetSQLServersDatabases()

5. {

6. ArrayList data = new ArrayList();

7. SqlConnection con = new SqlConnection("server=" + m_SQLServer +

";uid=" + m_Username + ";pwd=" + m_Password);

8. con.Open();

9. SqlCommand cmd = new SqlCommand();

10. cmd.Connection = con;

11. cmd.CommandType = CommandType.StoredProcedure;

12. cmd.CommandText = "sp_databases";

13. SqlDataReader dr = cmd.ExecuteReader();

14. while (dr.Read())

15. {

16. data.Add(dr.GetString(0));

17. }

18. con.Close();

19. return data;

20. }

21. string[] s;

22. public bool AttachDatabases(string patch)

23. {

24. try

25. {

26. char[] c = { '\\' };

Page 17: Hướng dẫn lập trình quản lý c#

27. s = patch.Split(c);

28. string ten = "";

29. ten = s[s.Length - 1];

30. string patch1 = "";

31. patch1 = patch.Substring(0, patch.Length - 4);

32. SqlConnection con = new SqlConnection(@"Data Source=" +

m_SQLServer + "; Initial Catalog = master; User=" + m_Username +

";Password=" + m_Password + ";");

33. con.Open();

34. SqlCommand cmd = new SqlCommand();

35. cmd.Connection = con;

36. cmd.CommandText = @"CREATE DATABASE [" + ten + "] ON (

FILENAME = N'" + patch + "' ),( FILENAME = N'" + patch1 + "_log.ldf' )

FOR ATTACH";

37. cmd.ExecuteNonQuery();

38. con.Close();

39. return true;

40. }

41. catch (Exception e)

42. {

43. MessageBox.Show(e.Message.ToString());

44. return false;

45. }

46. }

Bước 6: Ta viết các hàm sự kiện cho form

Để viết các hàm cho sự kiện click đầu tiên ta viết thêm các hàm hỗ trợ khác code như

sau:

1. SQLInformation sql = new SQLInformation();

2. DataProvide data = new DataProvide();

3. OpenFileDialog open = new OpenFileDialog();

4. private bool ktraHople()

5. {

6. if (cbServer.Text == "select")

7. {

8. MessageBox.Show("Please choose a SQL Server", "Khuvv -

NapolySoft", MessageBoxButtons.OK, MessageBoxIcon.Information);

9. cbServer.Focus();

10. return false;

11. }

12. 13. if (txtUser.Text == "")

14. {

15. MessageBox.Show("Please fill into left blank", "Khuvv -

NapolySoft", MessageBoxButtons.OK, MessageBoxIcon.Information);

16. txtUser.Focus();

Page 18: Hướng dẫn lập trình quản lý c#

17. return false;

18. }

19. 20. if (txtPass.Text == "")

21. {

22. MessageBox.Show("Please fill into left blank", "Khuvv -

NapolySoft", MessageBoxButtons.OK, MessageBoxIcon.Information);

23. txtPass.Focus();

24. return false;

25. }

26. return true;

27. }

28. private void loadServer()

29. {

30. listBox1.Items.Clear();

31. SQLInformation.m_Username = txtUser.Text;

32. SQLInformation.m_Password = txtPass.Text;

33. SQLInformation.m_SQLServer = cbServer.SelectedItem.ToString();

34. ArrayList data = sql.GetSQLServersDatabases();

35. for (int i = 0; i < data.Count; i++)

36. {

37. listBox1.Items.Add(data[i]);

38. }

39. listBox1.Show();

40. }

Tiếp theo nhấn đúp vào form để viết code cho sự kiện formload

1. private void Form1_Load(object sender, EventArgs e)

2. {

3. string cb = SystemInformation.ComputerName +

"\\SQL";//"\\SQLEXPRESS";

4. listBox1.Hide();

5. bt_dn.Enabled = false;

6. cbServer.Items.Add(cb);

7. }

Tương tự nhấn đúp vào nút Đăng nhập để viết code cho sự kiện Click của nút Đăng

nhập

1. private void bt_dn_Click(object sender, EventArgs e)

2. {

3. if (ktraHople())

4. {

5. loadServer();

6. }

7. }

Page 19: Hướng dẫn lập trình quản lý c#

Kế đến, nhấn đúp vào nút Truy cập để viết code cho sự kiện Click của nút Truy cập

1. private void btn_Load_Click(object sender, EventArgs e)

2. {

3. if (data.OpenConnection())

4. {

5. MessageBox.Show("Truy cập thành công", "Thông báo",

MessageBoxButtons.OK, MessageBoxIcon.Information);

6. data.CloseConnetion();

7. frmHangHoa f_hh = new frmHangHoa();

8. f_hh.Show();

9. }

10. else

11. MessageBox.Show("Truy cập thất bại", "Thông báo",

MessageBoxButtons.OK, MessageBoxIcon.Error);

12. }

Sau đó, nhấn đúp vào nút Thêm CSDL để viết code cho sự kiện Click của nút Thêm

CSDL

1. private void btnAttach_Click(object sender, EventArgs e)

2. {

3. open.Filter = "File (*.mdf)|*.mdf";

4. //Không cho phép chọn nhiều file

5. open.Multiselect = false;

6. //Set caption cho dialog

7. open.Title = "Chon CSDL";

8. //Set tên file mặc định

9. open.FileName = "";

10. //Hiển thị hộp thoại

11. DialogResult dgResult = open.ShowDialog();

12. if (dgResult == DialogResult.OK)

13. {

14. if (sql.AttachDatabases(open.FileName))

15. {

16. MessageBox.Show("Chèn thành công", "Thông báo",

MessageBoxButtons.OK, MessageBoxIcon.Information);

17. listBox1.Items.Clear();

18. bt_dn_Click(sender, e);

19. }

20. else

21. MessageBox.Show("Chèn thành thất", "Thông báo",

MessageBoxButtons.OK, MessageBoxIcon.Information);

22. }

23. }

Cuối cùng là các sự kiện nút xóa,thoát.

1. private void btn_Xoa_Click(object sender, EventArgs e)

Page 20: Hướng dẫn lập trình quản lý c#

2. {

3. txtPass.ResetText();

4. txtUser.ResetText();

5. listBox1.Hide();

6. }

7. private void btn_thoat_Click(object sender, EventArgs e)

8. {

9. Close();

10. }

Bước 7: Vào SQL tạo một cơ sở dữ liệu tên là QLBH vậy là chúng ta có thể kết

nối thành công.

=>Vậy là chương trình chúng ta đã hoàn thành sau đây là một số câu hỏi nhỏ dành cho các bạn.

III. Câu hỏi

1. Câu hỏi Thực hành:

Dựa vào word và video hướng dẫn các bạn hãy viết chương trình kết nối CSDL

dung file cấu hình XML(bài giải trong thư mục DemoKetNoiSQL của nhóm).

2. Câu hỏi lý thuyết:

A. XML là gì? Lợi ích của sử dụng XML trong ngôn ngữ C#?

Trả lời: XML (eXtensible Markup Langue) đóng một vai trò quan trọng

trong .NET. Không chỉ vì .NET cho phép bạn sử dụng XML trong các ứng

dụng của bạn, mà bản thân nó cũng sử dụng XML cho những file cấu hình

và tài liệu mã nguồn, như SOAP, các dịch vụ web và Ado.net. Do đó tìm

hiểu về các xử lý XML trong .Net với ngôn ngữ C# là một điều nên làm

B. Lớp XmlTextWriter dùng để làm gi?

Trả lời: Lớp XmlTextWriter cho phép bạn xuất XML thành một chuỗi,

một file hoặc một đối tượng a TextWriter. Giống như XmlTextReader, nó

là một kiểu forward-only, non-cached. XmlTextWriter có thể cấu hình

cao, cho phép bạn chỉ rõ những thứ như cho phép thục đầu dòng, số thục

đầu dòng, kí tự chỉ dẫn nào được dùng trong các giá trị thuộc tính cho

phép namespace hỗ trợ.

C. Nêu các tên lớp đọc và ghi file XML và giải thích các tên lớp đó

Trả lời:

Tên lớp Giải thích

XmlReader

Một lớp đọc trừu tượng nhanh và non-cached dữ liệu XML.

XmlReader được thiết kế giống như bộ phân tách SAX.

XmlWriter Một lớp viết trừu tượng nhanh và non-cached dữ liệu XML trong

Page 21: Hướng dẫn lập trình quản lý c#

một dòng hoặc định dạng file.

XmlTexReader

Mở rộng của XmlReader. Cung cấp chuỗi truy cập nhanh dữ liệu

XML.

XmlTexWriter Mở rộng của XmlWriter. Phát nhanh các dòng XML.

D. Bạn hãy viết một chuỗi kết nối trong file cấu hình để kết nối C# với CSDL

Trả lời: <connectStr>Data Source=ADMIN\SQLEXPRESS; Initial

Catalog =QLBH; Integrated Security=SSPI;</connectStr>

E. Hãy nêu cách sử dụng Schema property?

Trả lời: Schemas property của XmlValidatingReader chứa một

XmlSchemaCollection, có thể tìm thấy trong không gian

tên System.Xml.Schema. Tập hợp này tổ chức load lại loaded XSD và

XDR schemas. Nó cực nhanh đặc biệc là khi bạn cần kiểm tra sự hợp lệ

của nhiều tài liệu khác nhau, vì sơ đồ sẽ không được load mỗi khi kiểm

tra. Các bước sử dụng thuộc tính này như sau, bạn tạo một đối tượng

XmlSchemaCollection. Phương thức Add(), nằm trong một

XmlSchemaCollection, có bốn quá tải. Bạn có thể truyền nó cho một đối

tượng xuất phát từ XmlSchema, một đối tượng xuất phát từ

XmlSchemaCollection, một chuỗi không gian tên với chuỗi URI của file

sơ đồ và một đối tượng xuất phát từ XmlReader chứa trong sơ đồ.

F. Để sử dụng XmlTexReader cần khai báo thư viện nào?

Trả lời: using System.Xml;

3. Câu hỏi trắc nghiệm

1. Một lớp viết trừu tượng nhanh và non-cached dữ liệu XML trong một dòng

hoặc định dạng file.

A. XmlReader

B. XmlWriter

C. XmlTexReader

2. Một lớp trừu tượng miêu tả một nút đơn trong một tài liệu XML. Lớp cơ sở

cho các lớp khác trong namespace XML.

A. XmlDocument

B. XmlDataDocument

C. XmlNode

Page 22: Hướng dẫn lập trình quản lý c#

3. Thuộc tính HasAttributes sẽ????

A. Trả về giá trị tr e nế ó b t kì th ộ tính nào òn không sẽ trả về

false.

B. Cho bạn biết có bao nhiêu thuộc tính.

C. Trả về một thuộc tính thông qua tên hoặc chỉ mục.

4. Nếu bạn muốn xác nhận một tài liệu XML, bạn sẽ cần phải sử dụng lớp

XmlValidatingReader. Nó chứa các khả năng giống như XmlTextReader (Cả

hai đều xuất phát từ XmlReader) nhưng XmlValidatingReader có thêm thuộc

tính:

A. ValidationType.

B. Schemas.

C. SchemaType.

D. A,B,C đúng.

Page 23: Hướng dẫn lập trình quản lý c#

MỤC LỤC

PHẦN I: GIỚI THIỆU Error! Bookmark not defined.

I. Giới thiệu ........................................................................................................................... 23

II. Phân công nhóm ................................................................................................................. 24

PHẦN II: NỘI DUNG 25

I. Giới thiệu thư viện thực thi ................................................................................................ 25

II. Qui trình tạo thư viện thực thi ............................................................................................ 26

PHẦN III: KẾT LUẬN 31

PHẦN I: GIỚI THIỆU

I. Giới thiệu

Ngày nay, với sự phát triển mạnh mẽ của khoa học kỹ thuật đã dẫn tới sự ra đời của chiếc

máy tính. Nó đã trở thành phương tiện không thể thiếu trong học tập cũng như giải trí…Phát

triển song song với nó là sự ra đời của nhiều chương trình ứng dụng giúp chúng ta quản lý, điều

khiền các hoạt động công việc, học tập của chúng ta nhanh hơn, hiệu quả và hiện đại hơn. Nhưng

nếu một chương trình không có thư viện thực thi thì sẽ thiếu đi tính chuyên nghiệp trong một

phần mềm quản lý và điều này sẽ gây khó khăn cho người quản lý khi phải quản lý nhiều loại

người dùng khác nhau trong hệ thống, khi phát sinh hư hỏng hay đánh mất dữ liệu thì sẽ rất khó

có thể tìm ra ai đã làm điều đó. Vì lý do trên, nhóm chúng em đã chọn đề tài “Thư viện thực thi

trong hương trình q ản lý”.

Trên cơ sở tự nghiên cứu, phát triển và sự giúp đỡ của thầy Huỳnh Lý Thanh Nhàn đã

đóng góp những ý kiến cho việc nghiên cứu của chúng em cũng như trong các thức lập trình. Bài

báo được viết với mục đích giúp cho các bạn đọc biết về công dụng, hiểu quả của thư viện thực

thi cũng như có thể thiết kế được một phần mềm hiệu quả và sáng tạo với những thư viện thực

thi của chính mình.

Page 24: Hướng dẫn lập trình quản lý c#

II. Phân công nhóm

STT Tên Công việc

1 Huỳnh Minh Phương

DTH114120

Viết code chương trình, quay video, kiểm tra

và tập hợp tài liệu

2 Võ Thị Thanh Hằng

DTH114094

Soạn word (Phần I: Giới thiệu, Phần II: Nội

dung)

3 Lê Trương Yến Khanh

DTH114103

Soạn word(Phần II: Nội dung, Phần III: Kết

luận)

4 Nguyễn Thị Linh Chi

DTH114154 Soạn slide

5 Nguyễn Văn Thành

DTH114193 Soạn slide

Page 25: Hướng dẫn lập trình quản lý c#

PHẦN II: NỘI DUNG

1. Giới thiệ thư viện thực thi

Thư viện thực thi là một file giúp cho người dùng có thể quản lý được những

đối tượng nào đã đăng nhập, đăng xuất ở thời điểm và thực hiện những chức năng nào

trên cơ sở dữ liệu. File thư viện thực thi có thể sử dụng nhiều loại file khác nhau để

lưu trữ nhưng ở đây mình sử dùng file .txt để lưu dữ liệu và truy xuất đơn giản hơn.

Ví dụ: file thực thi text.txt

Cơ chế hoạt động của file thư viện thực thi như sau: Đầu tiên file sẽ lưu lại tên

người dùng đang sử dụng chương trình với quyền tương ứng của họ, thời điểm đối

tượng đăng nhập vào hệ thống và thực hiện trên CSDL nào. Tiếp theo là đối tượng đã

sử dụng chức năng nào trong CSDL đó. Cuối cùng là thời gian đăng xuất.

Page 26: Hướng dẫn lập trình quản lý c#

2. Qui trình tạo thư viện thực thi

Bước 1: Tạo class thư viện với 2 phương thức ghi thông tin đăng nhập và ghi

thông tin đăng xuất.

Bước 2: Tạo phương thức GhiThongTinDangNhap() trong class thư viện.

Phương thức này có 5 đối số truyền vào và đều là kiểu string, phương thức này giúp lưu

lại những thông tin của đối tượng đã đăng nhập vào hệ thống với quyền nào, thời điểm

đăng nhập và thực hiện trên CSDL nào của hệ thống. Các đối số truyền vào có thể thay

đổi tùy vào từng hệ thống khác nhau.

1 public static int tam=0;

2 //khai bao bien cho lop FileStream

3 public FileStream fs;

4 //cac doi so chuyen vao

5 public void GhiThongTinDangNhap(string bang,

string them,string xoa,string luu, string inbang)

6 {

7 //luu file voi ten text va định dang la txt

8 fs = new FileStream("text.txt", FileMode.Append);

Page 27: Hướng dẫn lập trình quản lý c#

9 //khai bien cho lop StreamWriter

10 StreamWriter sw = new StreamWriter(fs);

11 if (tam == 0)

12 {

13 //lay ten nguoi dung tu lop DN_taikhoan va luu lai

14 sw.WriteLine("Người dùng: " + DN_taikhoan.ten);

15 //lay quyen nguoi dung tu lop DN_taikhoan và luu lai

16 sw.WriteLine("Quyền:" + DN_taikhoan.quyen);

17 //thoi gian dang nhap vao he thong

18 sw.WriteLine("Đăng nhập: " + DateTime.Now);

19 //doi so bang duoc truyen vao

20 sw.WriteLine("Thao tác trên bảng: " + bang);

21 }

22 if (tam == 1)

23 {

24 //luu cac doi so duoc truyen vao

25 sw.WriteLine("Thực hiện chức năng: " + them);

26 sw.WriteLine("Thực hiện chức năng: " + xoa);

27 sw.WriteLine("Thực hiện chức năng: " + luu);

28 sw.WriteLine("Thực hiện chức năng: " + inbang);

29 }

30 sw.WriteLine(".................................\n");

31 sw.Close();

32 fs.Close();

33 }

Bước 3: Tạo phương thức GhiThongTinDangXuat() trong class thư viện. Phương

thức này không có đối số truyền vào, nó dùng để lưu lại thời gian đăng xuất của người

dùng sau khi đăng nhập và thực hiện các thao tác trên CSDL.

1 public void GhiThongTinDangXuat()

2 {

3 //luu file voi ten text va định dang la txt

4 fs = new FileStream("text.txt", FileMode.Append);

5 StreamWriter sw = new StreamWriter(fs);

Page 28: Hướng dẫn lập trình quản lý c#

6 //lay ten nguoi dung tu lop DN_taikhoan va luu lai

7 sw.WriteLine("Người dùng: " + (string)DN_taikhoan.ten);

8 sw.WriteLine("Đăng xuất: " + DateTime.Now);

9 sw.WriteLine("@--------------------------@\n");

10 sw.Close();

11 fs.Close();

12 }

Bước 4: Tạo form thư viện để hiển thị file thực thi.

Bước 5: Tạo các control trong form.

Trong toolbox, ta kéo thả button và richtextbox vào form thư viện và đổi

tên thành btn_mofile và rtb_thuvien, cụ thể như sau:

Page 29: Hướng dẫn lập trình quản lý c#

Bước 6: Trong sự kiện click của button để thực hiện đổ dữ liệu từ file text.txt vào

richtextbox ta gõ dòng code sau:

1 private void btn_mofile_Click(object sender, EventArgs e)

2 {

3 //showdialog cho nguoi dung lua chon file can mo

4 if (openFileDialog1.ShowDialog() == DialogResult.OK)

5 {

6 rtb_thuvien.Text = File.ReadAllText("text.txt");

7 }

8 }

Bước 7: Tạo form main.

Page 30: Hướng dẫn lập trình quản lý c#

Bước 8: Tạo 1 buton để khi click vào sẽ hiển thị form thư viện.

Và khi ckick vào sẽ hiển thị form thư viện ta đã tạo trước đó.

Page 31: Hướng dẫn lập trình quản lý c#

1 fm_ThuVien f_tv;

2 private void mi_thuvien_ItemClick(object

sender,ItemClickEventArgs e)

3 {

4 if (f_tv == null || f_tv.IsDisposed == true)

5 {

6 //cac doi so truyen vao phuong thuc GhiThongTinDangNhap()

7 //tv la bien cua lop thu vien

8 tv.GhiThongTinDangNhap("THƯ VIỆN THỰC THI", null, null,

null,null);

9 f_tv = new fm_ThuVien();

10 f_tv.MdiParent = this;

11 f_tv.Show();

12 }

13 }

Bước 9: Gọi phương thức ghi thông tin đăng nhập hoặc ghi thông tin đăng xuất

trong form main, tùy vào yêu cầu của hệ thống mà ta sẽ gọi 2 phương thức này ở đâu và

các đối số truyền vào sẽ là gì?

1 private void mi_dangxuat_ItemClick(object sender,

ItemClickEventArgs e)

2 {

3 //có thể thêm các dòng code xữ lý thêm

4 . . . . . . . . . . . . . . . . .

5 tv1.GhiThongTinDangXuat();

6 . . . . . . . . . . . . . . . . .

7 }

Bước 10: Ngoài ra chúng ta có thể lưu các thao tác thêm, xóa, sửa, in của người

dùng khi thực hiện trên hệ thống vào file.

1 private void bnt_them_Click(object sender, EventArgs e)

2 {

3 //có thể thêm các dòng code xữ lý thêm

4 . . . . . . . . . . . .

Page 32: Hướng dẫn lập trình quản lý c#

5 tv.GhiThongTinDangNhap(null, "Thêm(Phòng)",null,null,null);

6 . . . . . . . . . . . . . . .

7 }

Tương tự cho các thao tác xóa, sửa, in.

PHẦN III: KẾT LUẬN

Qua bài viết, nhóm chúng em hy vọng sẽ giúp bạn đọc phần nào hiểu được cách

xây dựng được một thư viện thực thi.

Cuối cùng, chân thành cảm ơn đến thầy Huỳnh Lý Thanh Nhàn đã tạo điều kiện,

giúp đỡ nhóm trong quá trình nghiên cứu và phát triển đề tài. Mặc dù chương trình vẫn

chưa hoàn thiện như nhóm em mong muốn, nhóm chúng em mong đươc sự góp ý của

thầy và các bạn để xây dựng chương trình tốt hơn.

Xin chân thành cảm ơn !

Page 33: Hướng dẫn lập trình quản lý c#

Mục Lục I. MÔ TẢ VÀ LỢI ÍCH CỦA ĐỀ TÀI. ............................................................................................... 0

II. DANH SÁCH CÁC CHỨC NĂNG CHÍNH TRONG CHƯƠNG TRÌNH. ............................... 1

1. Hệ thống. .......................................................................................................................................... 1

2. Danh mục. ........................................................................................................................................ 2

3. Nghiệp vụ. ........................................................................................................................................ 3

4. Tìm kiếm. ......................................................................................................................................... 3

5. Báo cáo – Thống kê. ........................................................................................................................ 3

6. Trợ gúp. ............................................................................................................................................ 3

III. KHAI BÁO NGƯỜI DÙNG SỬ DỤNG VÀ PHÂN QUYỀN. .................................................... 4

1. anh sá h người dùng và chứ năng được sử dụng tương ứng. ................................................. 4

2. Thiết kế bảng người dùng (CSDL). ............................................................................................... 5

3. Thực hiện phân quyền theo mô hình ba lớp. ................................................................................ 5

IV. HƯỚNG DẪN CÁC BƯỚC PHÂN QUYỀN CHI TIẾT ........................................................... 20

Bước 1:Thiết kế quan hệ NGUOIDUNG. ............................................................................................... 20

Bước 2:Thiết kế FormMain. .................................................................................................................... 21

Bước 3:Thiết kế form đăng nhập............................................................................................................. 25

Bước 4:Xây dựng lớp người dùng DataLayer. ........................................................................................ 28

Bước 5:Xây dựng lớp BusinessLayer. .................................................................................................... 30

Bước 6: Viết code cho DangNhap.cs ( Lớp GUI). .................................................................................. 32

Bước 7: Phân quyền cho FornMain.cs ( Lớp GUI). ................................................................................ 32

V. BẢNG PHÂN CÔNG ........................................................................................................................ 35

VI. BÀI TẬP THỰC HÀNH ............................................................................................................... 35

VII. KẾT LUẬN. ................................................................................................................................... 36

I. MÔ TẢ VÀ LỢI ÍCH CỦA ĐỀ TÀI.

1. Mô tả đề tài.

Page 34: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 1 | 262

‒ Ở hầu hết các chương trình quản lý, để đảm bảo tính an toàn cho dữ

liệu cũng như tránh tình trạng ai cũng sủ dụng được những chức năng mang

quyền hạn cao, vấn đề đặt ra cho người lập trình là phải phân cấp tất cả các

chức năng trong chương trình, với mỗi người dùng đăng nhập vào hệ thống thì

họ có những quyền hạn để sử dụng chương trình, với mỗi quyền hạn tương

ứng với những chức năng cụ thể.

‒ Với đề tài trên, nhóm tiến hành phân quyền trên chương trình quản lý

nhân sự của một công ty (tự xây dựng) và tiến hành phân quyền người dùng

trên chính phần mềm này.

‒ Trong chương trình chúng ta sẽ có danh sách những người dùng sau

đây :

+ Người dùng Admin (Giám Đốc)

+ Người dùng Nhân Viên Quản Lý

+ Người dùng Nhân Viên

‒ Với người dùng Admin (Giám Đốc) : người dùng này sẽ có toàn

quyền, có nghĩa là Giám Đốc sẽ sử dụng được tất cả các chức năng trong

chương chình quản lý nhân sự.

‒ Với quyền là nhân viên quản lý thì người dùng này có quyền sử dủng

các chức năng quản lý như : quản lý nhân viên, quàn lý phòng ban, quản lý

lương của nhân viên, ..v.v.

‒ Quyền nhân viên bình thường thì hầu như chỉ được sử dụng các chức

năng cơ bản của hệ thống.

‒ Công việc phân quyền người dùng được thực hiện trên ngôn ngữ lập

trình cấp cao C# . Với mỗi loại người dùng sau khi đăng nhập vào hệ thống sẽ

lấy quyền người dùng dựa vào tên đăng nhập và cuối cùng là cho các tắt/bật

các chức năng tương ứng với quyền người dùng.

2. Mụ đí h ủa phân quyền người dùng.

Việc phân quyền ngày nay không còn nhằm chỉ là phân công công việc.

Phân quyền ngày nay còn có nhiều mục đích. Những mục đích của việc ủy

quyền, tránh thoái thác trách nhiệm của những nhân sự trong công ty :

+ Phân rõ chức năng và nhiệm vụ của mỗi nhân viên

+ Xác lập quyền hạn, trách nhiệm với tửng đầu công việc

II. DANH SÁCH CÁC CHỨC NĂNG CHÍNH TRONG CHƯƠNG TRÌNH.

1. Hệ thống.

STT Chứ năng Mô tả

1 Đăng nhập Cho phép người dùng sử dụng tài khoảng

của mình đăng nhập để giao tiếp với úng

dụng

2 Đăng xuất Thoát khỏi tài khoảng của người dùng đang

sử dụng chương trình

3 Đổi mật khẩu Cho phép người dùng đổi mật khẩu của tài

Page 35: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 2 | 262

khoảng hiện tại đang đăng nhập vào hệ

thống.

4 Quản lý người dùng Cho phép nhà quản người dùng admin thực

hiện thêm xoá sửa thông tin người dùng.

5 Sao lưu dữ liệu Sao lưu dữ liệu của cơ sở dữ liệu để tránh

trường hợp hệ thống bị sự cố làm mất dữ liệu

của CSDL.

6 Phục hồi dữ liệu Khôi phục lại dữ liệu dựa vào mẫu tin đã

dược sao lưu trước đó. Phục hồi lại nguồn dữ

liệu có trạng thái lúc được sao lưu

7 Thoát Thoát khỏi ứng dụng (tắt chương trình)

2. Danh mục.

STT Chứ năng Mô tả

1 Danh mục Nhân viên Hiển thị form Nhân Viên cho phép nhà quản

trị thực hiện xoá, sửa thông tin nhân viên

trong công ty hoặc thêm một nhân viên mới

vào danh sách nhân viên của công ty.

2 Danh mục Phòng ban Cho phép người dùng là nhà quản trị quản lý

danh mục các phòng ban trong công ty.

3 Danh mục Chức vụ Cho phép người dùng là nhà quản trị quản lý

danh sách các chức vụ có trong công ty.

4 Danh mục Chuyên

môn

Cho phép người dùng là nhà quản trị quản lý

danh mục các chuyên môn của mỗi nhân

viên trong công ty.

5 Danh mục Trình độ Cho phép người dùng là nhà quản trị quản lý

danh mục trình độ trong công ty.

6 Danh mục Hợp đồng Cho phép người dùng là nhà quản trị quản lý

danh mục các hợp đồng trong công ty.

7 Danh mục Khen

thưởng

Cho phép người dùng là nhà quản trị quản lý

danh sách nhân viên được khen thưởng trong

công ty.

8 Danh mục Kỹ luật Cho phép người dùng là nhà quản trị quản lý

danh mục các phòng ban trong công ty.

9 Danh mục Bảo hiểm Cho phép người dùng là nhà quản trị quản lý

danh mục các bảo hiểm có trong công ty của

mỗi nhân viên.

10 Danh mục Nghỉ phép Cho phép người dùng là nhà quản trị quản lý

danh sách nhân viên đã nghỉ phép ban trong

công ty.

11 Danh mục Thân nhân Cho phép người dùng là nhà quản trị quản lý

danh mục các thân nhân của mỗi nhân viên

trong công ty.

12 Danh mục Dân tộc Cho phép người dùng là nhà quản trị quản lý

danh mục dân tộc trong công ty.

Page 36: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 3 | 262

13 Danh mục Tôn giáo Cho phép người dùng là nhà quản trị quản lý

danh mục tôn giáo trong công ty.

3. Nghiệp vụ.

STT Chứ năng Mô tả

1 Quản lý Nhân Viên Quản lý thông tin nhân viên trong công ty.

2 Chuyển phòng ban Giải quyết chuyển phòng ban cho các nhân

viên khi được thay đổi chức vụ

3 Quản lý Lương Cho phép người dùng đổi mật khẩu của tài

khoảng hiện tại đang đăng nhập vào hệ

thống.

4 Giải quyết ứng lương Cho phép nhà quản người dùng admin thực

hiện thêm xoá sửa thông tin người dùng.

4. Tìm kiếm.

STT Chứ năng Mô tả

1 Tìm kiếm Nhân Viên Cho phép tìm kiếm thông tin của tất cả nhân

viên có trong công ty.

2 Tìm kiếm Thân nhân Thực hiện tìm kiếm thông tin thân nhân của

mỗi nhân viên thông qua mã của nhân viên

đó.

3 Tìm kiếm Bảng Lương Cho phép tìm kiếm bảng lương tháng của

các nhân viên, bảng lương theo quý hoặc

theo năm của các nhân viên, hay bảng lương

cá nhân của mỗi nhân viên.

5. Báo cáo – Thống kê.

STT Chứ năng Mô tả

1 Lập Bảng kỹ luật Cho phép xem, thêm, xoá, sửa hoặc in bảng

danh sách nhân viên bị kỹ luật.

2 Lập Bảng nghỉ phép Thực hiện xem, thêm, xoá, sửa hoặc in bảng

danh sách nhân viên được giải quyết nghỉ

phép.

3 Lập Bảng danh sách

khen thưởng

Cho phép xem, thêm, xoá, sửa hoặc in bảng

danh sách nhân viên được khen thưởng.

4 Lập Bảng lương Thực hiện xem, thêm, xoá, sửa bảng lương

tháng của các nhân viên, bảng lương theo

quý hoặc theo năm của các nhân viên, hay

bảng lương cá nhân của mỗi nhân viên.

6. Trợ gúp.

STT Chứ năng Mô tả

1 Thông tin chương trình Hiển thị form chứa thông tin của chương

trình.

2 Hướng dẫn sử dụng Xuất hiện file hướng dẫn sử dụng chương

Page 37: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 4 | 262

trình.

III. KHAI BÁO NGƯỜI DÙNG SỬ DỤNG VÀ PHÂN QUYỀN.

1. anh sá h người dùng và chứ năng được sử dụng tương ứng.

STT Tên người dùng Danh sách chứ năng được sử dụng

1 Giám đốc ( Admin) Sử dụng được tất cả các chức năng của chương

trình

2 Nhân viên quản lý Đăng nhập

Đăng xuất

Đổi mật khẩu

Thoát

Danh mục Nhân viên

Danh mục Phòng ban

Danh mục Chức vụ

Danh mục Chuyên môn

Danh mục Trình độ

Danh mục Hợp đồng

Danh mục Khen thưởng

Danh mục Danh mục Kỹ luật

Danh mục Bảo hiểm

Danh mục Nghỉ phép

Danh mục Thân nhân

Danh mục Dân tộc

Danh mục Tôn giáo

Quản lý Nhân Viên

Chuyển phòng ban

Quản lý Lương

Giải quyết ứng lương

Tìm kiếm Nhân Viên

Tìm kiếm Thân nhân

Tìm kiếm Bảng Lương

Lập Bảng kỹ luật

Lập Bảng nghỉ phép

Lập Bảng danh sách khen thưởng

Lập Bảng lương

Thông tin chương trình

Hướng dẫn sử dụng

3 Nhân viên Đăng nhập

Đăng xuất

Đổi mật khẩu

Thoát

Danh mục Nhân viên

Danh mục Phòng ban

Danh mục Chức vụ

Danh mục Chuyên môn

Danh mục Trình độ

Page 38: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 5 | 262

Danh mục Hợp đồng

Danh mục Khen thưởng

Danh mục Danh mục Kỹ luật

Danh mục Bảo hiểm

Danh mục Nghỉ phép

Danh mục Thân nhân

Danh mục Dân tộc

Danh mục Tôn giáo

Thông tin chương trình

Hướng dẫn sử dụng

2. Thiết kế bảng người dùng (CSDL).

STT Thuộc tính Kiểu dữ liệu Mô tả

1 TENDN Varchar(50) Tên đăng nhập

2 MATKHAU Varchar(50) Mật khẩu là dãy ký tự

không quy định về chiều

dài để tính bảo mật cao

hơn.

3 QUYEN Tinyint Quyền được quy định là

các số nguyên, được đánh

số từ 1 tới n (n là tổng số

quyền có trong công ty)

4 MOTAQUYEN Nvarchar(50) Chi tiết hoá các quyền

người dùng đăng nhập. hệ

thống hiện tại có các

quyền sau : Admin, nhân

viên quản lý, nhân viên

Bảng người dùng trong mô hình quan hệ :

Hình 1

3. Thực hiện phân quyền theo mô hình ba lớp.

a) Phân quyền chi tiết trên form chính (frmMain).

Page 39: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 6 | 262

‒ Với quyền Admin (Giám Đốc).

+ Danh sách các control của Ribon:

STT Tên control Trạng thái

Bật Tắt

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

+ Hình ảnh mô tả:

Page 40: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 7 | 262

Hình 2.1 : Admin – Hệ thống

Hình 2.2 : Admin – Danh Mục

Page 41: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 8 | 262

Hình 2.3 : Admin – Nghiệp Vụ

Hình 2.3 : Admin – Tìm Kiếm

Page 42: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 9 | 262

Hình 2.4 : Admin – Báo Cáo –Thống Kê

Hình 2.4 : Admin – Trợ Giúp

‒ Quyền Nhân viên quản lý

Page 43: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 10 | 262

+ Danh sách các control của Ribon:

STT Tên control Trạng thái

Bật Tắt

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

+ Hình ảnh mô tả:

Page 44: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 11 | 262

Hình 3.1 :Nhân Viên QL – Hệ thống

Hình 3.2 : Nhân Viên QL – Danh Mục

Page 45: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 12 | 262

Hình 3.3 : Nhân Viên QL –Nghiệp Vụ

Hình 3.4 :Nhân Viên QL – Tìm kiếm

Page 46: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 13 | 262

Hình 3.5 : Nhân Viên QL – Báo Cáo – Thống Kê

Hình 3.6 : Nhân Viên QL – Trợ Giúp

Page 47: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 14 | 262

‒ Quyền Nhân viên.

+ Danh sách các control của Ribon:

STT Tên control Trạng thái

Bật Tắt

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

+ Hình ảnh mô tả:

Page 48: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 15 | 262

Hình 4.1 : Nhân Viên – Hệ Thống

Hình 4.2 : Nhân Viên – Danh Mục

Page 49: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 16 | 262

Hình 4.3 :Nhân Viên –Nghiệp Vụ

Hình 4.4 :Nhân Viên –Tìm Kiếm

Page 50: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 17 | 262

Hình 4.5 :Nhân Viên –Báo Cáo-Thống Kê

Hình 4.6 : Nhân Viên – Trợ Giúp

Page 51: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 18 | 262

b) Form đăng nhập.

‒ Hình ảnh:

Hình 5 : Form đăng nhập

‒ Danh sách các control :

STT Control

1 reflabDangNhap

2 labTenDangNhap

3 txtTenDangNhap

4 labMatKhau

5 txtMatKhau

6 btnDongY

7 btnHuy

Page 52: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 19 | 262

‒ Các xử lý :

STT Tên xử lý Mô tả

1 LayQuyen(string,string) Hàm trả về là một giá trị kiểu int thuộc 1

trong các giá trị sau (1,2,3) tương ứng với

các quyền đăng nhập vào hệ thống, hai

tham số truyền vào : txtTenDangNhap.Text

và txtMatKhau.Text.

2 KTDN(string) Hàm trả về kiều bool, có chức năng kiểm

tra sự tồn tại của tên đăng nhập. Tham số

duy nhất truyền vào là

txtTenDangNhap.Text. Nếu tên đăng nhập

hợp lệ hàm trả về giá trị là true, ngược lại

sẽ có giá trị là false.

3 KTMK(string, string) Hàm trả về kiểu bool, kiểm tra tính đúng

đắn của mật khẩu dựa vào tên đăng nhập

tương ứng, hai tham số truyền vào :

txtTenDangNhap.Text và

txtMatKhau.Text. Nếu mật khẩu hợp lệ

hàm trả về giá trị là true, ngược lại sẽ có

giá trị là false.

4 btnDongY_Click

(object, EventArgs)

Hàm không có giá trị trả về (void), hàm sử

dụng hai hàm thành viên khác :

KTDN(string) và KTMK(string, string) nếu

một trong hai hàm này có giá trị thì xuất

hiện thông báo lỗi tương ứng. Nếu cả hai

hàm thành viên đều có giá trị là true thì

Form Main sẽ được gọi, đồng thời thông

tin cùa hai textbox sẽ được lưu lại.

c) Người dùng BusinessLayer.

‒ Hàm kiểm tra tên đăng nhập: Hàm trả về kiều bool, có chức năng

kiểm tra sự tồn tại của tên đăng nhập. Tham số duy nhất truyền kiểu

string. Nếu tên đăng nhập hợp lệ hàm trả về giá trị là true, ngược lại sẽ

có giá trị là false.

‒ Hàm kiểm tra mật khầu dựa trên tên đăng nhập: Hàm trả về kiểu bool,

kiểm tra tính đúng đắn của mật khẩu dựa vào tên đăng nhập tương

ứng, hai tham số truyền vào kiểu string. Nếu mật khẩu hợp lệ hàm trả

về giá trị là true, ngược lại sẽ có giá trị là false.

‒ Hàm lấy quyền người dùng: Hàm trả về là một giá trị kiểu int thuộc 1

trong các giá trị sau (1,2,3) tương ứng với các quyền đăng nhập vào

hệ thống, hai tham số truyền vào kiểu string.

Page 53: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 20 | 262

d) Người dùng DataLayer.

‒ Hàm kiểm tra tên đăng nhập: Hàm trả về kiều bool, có chức năng

kiểm tra sự tồn tại của tên đăng nhập. Tham số duy nhất truyền kiểu

string. Nếu tên đăng nhập hợp lệ hàm trả về giá trị là true, ngược lại sẽ

có giá trị là false.

‒ Hàm kiểm tra mật khầu dựa trên tên đăng nhập: Hàm trả về kiểu bool,

kiểm tra tính đúng đắn của mật khẩu dựa vào tên đăng nhập tương

ứng, hai tham số truyền vào kiểu string. Nếu mật khẩu hợp lệ hàm trả

về giá trị là true, ngược lại sẽ có giá trị là false.

‒ Hàm lấy quyền người dùng: Hàm trả về là một giá trị kiểu int thuộc 1

trong các giá trị sau (1,2,3) tương ứng với các quyền đăng nhập vào

hệ thống, hai tham số truyền vào kiểu string.

IV. HƯỚNG DẪN CÁC BƯỚC PHÂN QUYỀN CHI TIẾT

Bước 1:Thiết kế quan hệ NGUOIDUNG.

a) Code sql cho bảng người dùng :

Hình 6.1

b) Hình ảnh bảng người dùng trong CSDL

Hình 6.2

Page 54: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 21 | 262

c) Nhập liệu cho bảng người dùng :

Hình 6.3

Bước 2:Thiết kế FormMain.

a) Tạo Project mới:

Mở Visual Studio chọn File -> New ->Project(hoặc Create Project)

Hình 7.1

Page 55: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 22 | 262

Hình 7.2

Thực hiện 3 bước như hình 7.3

Chọn

vào đây

Page 56: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 23 | 262

Hình 7.3

Ta được giao diện FormMain như sau :

Hình 7.4: Giao diện chính sao khi tạo

b) Chỉnh sửa lại theo mục đích của bản thân

Chọn vào Ribon -> click vào mũi tên bên phải -> Chọn RunDesign

1

2

3

Page 57: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 24 | 262

Chỉnh sửa tên RibonPage

Hình 7.5

Sửa caption các button

Hình 7.6

Sửa Name cho Button

Page 58: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 25 | 262

Hình 7.7

c) Sau khi chỉnh sửa tất cả ta được FormMain hoàn chỉnh như sau :

Hình 7.8 :Form Main

Bước 3:Thiết kế orm đăng nhập.

a) Vào cửa sổ Solution click chuột phải vào tên Solutoin -> add-

>Windows Form…

Page 59: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 26 | 262

Hình 8.1: Chèn Form đăng nhập

Hình 8.2 Đặt tên cho form mới

b) Kéo các Control vào từ cửa sổ ToolBox

Page 60: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 27 | 262

Hình 8.3 Control ReflectionImage

Hình 8.3 Chọn hình cho Control ReflectionImage

Hình 8.4 Control ReflectionLabel

Page 61: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 28 | 262

Hình 8.4 Chỉnh sửa thuộc tính cho Control ReflectionLabel

Hình 8.5 Control Label,Button, Textbox

Bước 4:Xây dựng lớp người dùng DataLayer.

a) Chèn class người dùng DataLayer

Page 62: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 29 | 262

Hình 9.1 Chèn class Người dùng

b) Hàm kiểm tra tên đăng nhập

Hình 9.2

c) Hàm kiểm tra mật khẩu

Page 63: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 30 | 262

Hình 9.3

d) Hàm lấy quyền

Hình 9.4

Bước 5:Xây dựng lớp BusinessLayer.

a) Chèn class người dùng BusinessLayer

Hình 10.1

b) Hàm kiểm tra tên đăng nhập

Page 64: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 31 | 262

Hình 10.2

c) Hàm kiểm tra mật khẩu.

Hình 10.3

d) Hàm lấy quyền người dùng.

Hình 10.4

Page 65: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 32 | 262

Bước 6: Viết code cho DangNhap.cs ( Lớp GUI).

Bước 7: Phân quyền cho FornMain.cs ( Lớp GUI).

a) Quyền giám đốc( hàm Giamdoc() kiểu void)

STT Tên control Enable

true false

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

Page 66: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 33 | 262

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

b) Quyền nhân viên quản lý(Hàm NhanVienQL() kieu void)

STT Tên control Enable

true false

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

Page 67: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 34 | 262

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

c) Quyền nhân viên

STT Tên control Enable

true false

1 tsbDangNhap

2 tsbDangXuat

3 tsbDoiMatKhau

4 tsbQuanLyNguoiDung

5 tsbThoat

6 tsbSaoLuuDL

7 tsbPhucHoiDL

8 rgbiSkins

9 tsbNhanVien

10 tsbPhongBan

11 tsbChucVu

12 tsbChuyenMon

13 tsbTrinhDo

14 tsbHopDong

15 tsbKhenThuong

16 tsbKyLuat

Page 68: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 35 | 262

17 tsbLichCongTac

18 tsbBaoHiem

19 tsbNghiPhep

20 tsbThanNhan

21 tsbDanToc

22 tsbTonGiao

23 tsbNV_NhanVien

24 tsbChuuyenPhongBan

25 tsbLuong

26 tsbUngLuong

27 tsbTK_NhanVien

28 tsbTK_ThanNhan

29 tsbTK_Luong

30 tsbBangKyLuat

31 tsbBangNghiPhep

32 tsbBangKhenThuong

33 tsbBangLuong

34 tsbThongTinPM

35 tsbHuongDanSuDung

V. BẢNG PHÂN CÔNG

STT Tên công việc Thành viên thực hiện

1 Viết báo cáo(Word) Nguyễn Thiện An

2 Slide báo cáo(Powerpoint) Khưu Văn Hiền

3 Quay video hướng dẫn Nguyễn Thiện An

4 Viết demo(Source code) Khưu Văn Hiền

VI. BÀI TẬP THỰC HÀNH

Câu 01: Phân quyền người dùng có những lợi ích gì?

a) Phân rõ chức năng và nhiệm vụ của mỗi nhân viên

b) Xác lập quyền hạn cho từng nhân sự

c) Ủy quyền, tránh thoái thác trách nhiệm, giúp dữ liệu có tính bảo mật

hơn

d) Tất cả các ý trên

Câu 02: Danh sách các chứ năng ủa hệ thống hiện tại gồm bao nhiêu

danh mục?

a) 5

b) 6

c) 7

d) 9

Câ 03: Chương trình được nhóm chọn để phân quyền có tên :

Page 69: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 36 | 262

a) Quản lý nhân viên

b) Quản lý tiền lương

c) Quản lý nhân sự

d) Quản lý nhà hàng

Câ 04: anh sá h người dùng của hệ thống hiện tại

a) 2

b) 3

c) 4

d) 5

Câu 05: Nhóm thực hiện phân quyền trên mô hình nào?

a) Trực tiếp

b) Hai lớp

c) Ba lớp

d) Bốn lớp

Câu 06: Bảng người dùng trong CSDL của nhóm thực hiện gồm các

trường nào?

a) STT, TENDN, MATKHAU, QUYEN, MOTAQUYEN

b) TENDN, MATKHAU, QUYEN, MOTAQUYEN, CHITIET

c) TENDN, MATKHAU, QUYEN, MOTAQUYEN

d) TENNGUOIDUNG, TENDN, MATKHAU, QUYEN,

MOTAQUYEN

Câu 07: Có m y phương thứ được thực hiện ơ tầng GUI?

a) 5

b) 6

c) 7

d) 9

VII. KẾT LUẬN.

‒ Thực hiện phân quyền người dùng trên môi trường C# .

‒ Ứng dụng trên chương trình quản lý nhân sự cho một công ty(ảo).

Nhóm chúng em xin gửi lời cám ơn chân thành tới thầy Huỳnh Lý Thanh Nhàn-

người trực tiếp hướng dẫn chúng em hoàn thành bài báo cáo này.

Page 70: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 37 | 262

I.Giới thiệu sơ lược về Devexpress

Trong loạt bài về DevExpress tôi chủ yếu tập trung vào XPO và XAF, đây được xem là

xương sống của DevExpress.

DevExpress là một Framework được viết cho nền tảng .NET Framework. Nó cung cấp

các control và công nghệ để phục vụ cho quá trình phát triển phần mềm. Thành phần của

DevExpress gồm:

WinForms Controls: Cung cấp các control cho WinForms.

o ASP.NET Controls: Cung cấp các control cho WebForms.

o WPF Controls: Cung cấp các control cho WPF.

o Silverlight Controls: Cung cấp các control cho Silverlight.

o XtraCharts: Control cung cấp các loại biểu đồ.

o XtraReports: Cung cấp các control tạo báo cáo.

o XPO: Cung cấp môi trường làm việc với database.

o XAF: Một công nghệ mới giúp việc phát triển phần mềm một cách nhanh chóng

Trải qua hàng loạt phiên bản, DevExpress đã từng bước được nâng cấp, hoàn thiện và

thêm mới rất nhiều chức năng. Với phiên bản DevExpress 12.2 hiện tại, bạn đã được cung

cấp những công cụ, môi trường tuyệt vời để biến những ý tưởng của bạn thành hiện thực

một cách nhanh chóng, dễ dàng.

II.Hướng dẫn cài đặt Devexpress 12.2.7 và cách Crack phần mềm.

- Đầu tiên,bạn phải download phần mềm Devexpress phiên bản 12.2.7 về máy,nhớ

download thêm phần có tên là: DevExpress.Registration.Setup.v12.2.7.msi,vì đây là file

crack sau khi ta cài xong Devexpress,sẽ chạy file này để crack phần mềm.

- Sau khi download xong ,bạn chạy file DXperience-12.2.7.exe để tiến hành cài đặt

+ Lưu ý :trước khi cài,bạn phải tắt chương trình visual studio đi.

+ Khi cài đặt,màn hình sẽ xuất hiện như sau :

Page 71: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 38 | 262

- Click vào chỗ khoanh tròn. Tiếp theo là:ta chọn accept &Install để tiến hành cài đặt.

-Chờ quá trình cài đặt

Page 72: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 39 | 262

- Cuối cùng,nhấp vào Finish

Tiếp theo là đến phần crack

Bạn chạy file DevExpress.Registration.Setup.v12.2.7.msi

Page 73: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 40 | 262

Check vào visual máy bạn đang dùng hoặc check vào tất cả nếu bạn muốn.Click Next,sau

đó finish là kết thúc công việc chạy file crack.Vậy là bạn vừa cài và crack xong

Devexpress 12.2.7.

b.Tạo dự án window form với Dev ExtraForm Wizard

- Để tạo được form Dev ExtraForm Wizard,bạn mở visual studio 2008

Page 74: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 41 | 262

B2:

B3:

- Chọn loại Ribbon Style:Ribbon Office 2010 và Ribbon Office 2007

- Chọn loại NavigationBar:Explorer view và Navigation Pane View

- Chọn loại GridControl:Table View và Layout View.

1

2

Page 75: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 42 | 262

B4:Sau khi chọn xong,click nút Create để tạo form,ta được kết quả:

-Từ hình ảnh minh họa cho thấy ,khi ta tạo ở chế độ form wizard,ta sẽ được bổ sung nhiều

thành phần trong form.Ví dụ như:NabarControl,Ribbon control,Image Collection.Và hơn

thế nữa ,trong form Wizard,ta sẽ có được thành phần Skin, dùng để thay đổi giao diện của

toàn form theo ý thích của người dùng.

Chọn ribbon

style

Chọn loại

navigation bar

Chọn loại

grid control

Page 76: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 43 | 262

III.RibbonControl (Menu hiện đại)

i. Add danh sách hình ảnh sẵn vào một công cụ quản lý ImageCollection

- Khi bạn vừa tạo xong form,thì Image Collection sẽ tự tạo ra,nếu bạn vô tình xóa đi,bạn có

thể vào Toolbox chọn,rồi kéo thả vào form.

Page 77: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 44 | 262

- Để chọn hình ảnh cho ImageCollection ,ta click chuột phải->Choose Image-

>ImageInfo Collection Editor->Add:Chọn hình ảnh cần thiết,sau đó ta click OK.

- Để thêm RibbonPage vào form,ta chọn bất kỳ đối tượng Ribbonpage ,click phải -

>Add Page

- Để thêm RibbonPageGroup ,ta chọn bất kỳ đối tượng RibbonPage,click phải->Add

PageGroup

- Để thêm BarButtonItem,ta chọn bất kỳ đối tượng RibbonPageGroup,click phải-

>Add Button

IV.Chọn hình ảnh trong imagecollection cho Ribbon

-Chọn hình ảnh cho RibbonPage, BarButtonItem.

-Chọn toàn bộ Ribbon,chọn Run Designer,màn hình sẽ xuất hiện

Lưu trữ

small image

Lưu trữ

Large image

Ribbon page

RibbonPageGroup

BarbuttonItem

Page 78: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 45 | 262

Chọn vào đối tượng cần chèn hình vào,sẽ có 2 chế độ ImageIndex(chọn hình nhỏ) hoặc

LargeImageIndex(chọn hình lớn).Lưu ý:chọn theo index(vị trí) hình ảnh.

V. Set trạng thái IsMdiContainer

-Thuộc tính IsMdiContainer trong form:có 2 giá trị True hoặc False

- Nói cách khác thuộc tính IsMdiContainer là cách thiết lập form cha,form con giữa các

form với nhau.

- Nếu IsMdiContainer=True:chế độ form cha/form con được thiết lập,khi gọi bất kỳ

form nào ,nó sẽ nhảy vào form chính được thiết lập IsMdiContainer.

- Mặc định,khi vừa mới tạo form, IsMdiContainer =False,nghĩa là ở chế độ bình

thường.

- Muốn thiết lập thuộc tính IsMdiContainer cho form ,ta vào

Properties chọn,sẽ thấy thuộc tính IsMdiContainer ,tại đây,sẽ

thấy có 2 thuộc tính là True hoặc False.

1 2

2

Page 79: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 46 | 262

VI.Sử dụng NavBar bên tay trái để làm thành phần Explorer

- Nếu sử dụng Project Wizard phải xóa split panel và layout lại – Dock Panel Left,

Main Panel trống để chứa form chương trình quản lý.

- Để tạo thêm NavBarGroup:click phải->add Group

- Để tạo thêm NavBarItem cho một Group nào đó->click phải->Add Item

VII.Cách thay đổi biểu tượng DX icon

- Chỉnh properties của RibbonControl là ApplicationIcon=image (chọn hình ảnh mình

muốn thay đổi)

NavbarControll NavBarControl

NavBarGroup

NavBarItem

Page 80: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 47 | 262

VIII.Dàn form Quản lý nhân viên dựa trên Devexpress 12.2.7

Hệ thống: đăng nhập, đăng xuất, thoát, sao lưu, phục hồi, đổi mật khẩu,quản người

dùng, cài đặt(thay đổi giao diện-Skin trong Devexpress).

Danh mục:nhân viên,phòng ban,công việc,kỹ năng,thành phố,dự án,… (bảng trong

cơ sở dữ liệu).

Nghiệp vụ :phân công dự án,cung cấp thiết bị,quản lý kỹ năng…. (use case của hệ

thống).

Thống kê báo cáo: chi tiết cung cấp thiết bị,danh sách nhân viên trong công ty,danh

sách phòng ban cùng với nhân viên phòng ban đó,danh sách dự án của mỗi thành

phố,tổng kinh phí của dự án(sql để tổng kết – người dùng rất cần).

Giúp đỡ: Tìm kiếm: tìm tất cả danh mục (nhiều) và nâng cao (google), thông tin

bản quyền, hướng dẫn sử dụng.

Mô phỏng giao diện cho vấn đề dàn form quản lý bán hàng

- Hệ thống

Chọn hình ảnh khác để làm icon

trong ribbon form

Page 81: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 48 | 262

Hình 1.Hình ảnh giao diện hệ thống bán hàng

Các thành phần giao diện

STT Tên đối tượng Mô tả Chức năng

1 skin Chứa giao diện form Thay đổi giao diện

2 Barbtn_dangnhap Dùng để đăng nhập vào hệ thống Đăng nhập

3 Barbtn_dangxuat Dùng để đăng xuất ra hệ thống Đăng xuất

4 Barbtn_doimatkhau Đổi mật khẩu người dùng Đổi mật khẩu

5 Barbtn_saoluu Sao lưu cơ sở dữ liệu hiện tại Sao lưu

6 Barbtn_phuchoi Phục hồi cơ sở dữ liệu đã sao lưu Phục hồi

7 Barbtn_thoat Thoát khỏi hệ thống Thoát

- Danh mục

1 2 3 4

5

6

7

Page 82: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 49 | 262

Hình 2.hình ảnh giao diện danh mục quản lý bán hàng

Các thành phần của giao diện

STT Loại Control Đặt tên Nội dung Ghi

chú

1 Devexpress.XtraBar.BarButtonItem Barbtn_nhanvien Nhân viên

2 Devexpress.XtraBar.BarButtonItem Barbtn_hanghoa Hàng hóa

3 Devexpress.XtraBar.BarButtonItem Barbtn_donvitinh Đơn vị tính

4 Devexpress.XtraBar.BarButtonItem Barbtn_kho Kho

5 Devexpress.XtraBar.BarButtonItem Barbtn_hoadon Hóa đơn

6 Devexpress.XtraBar.BarButtonItem Barbtn_daily Đại lý

7 Devexpress.XtraBar.BarButtonItem Barbtn_nhacungcap Nhà cung cấp

8 Devexpress.XtraBar.BarButtonItem Barbtn_khachhang Khách hàng

- Nghiệp vụ

Hình 3.hình ảnh giao diện nghiệp vụ quản lý bán hàng

Các thành phần của giao diện

STT Loại Control Đặt tên Nội dung Ghi

chú

1 Devexpress.XtraBar.BarButtonItem Barbtn_nhaphang Nhập hàng

2 Devexpress.XtraBar.BarButtonItem Barbtn_bansi Bán sỉ

3 Devexpress.XtraBar.BarButtonItem Barbtn_banle Bán lẻ

4 Devexpress.XtraBar.BarButtonItem Barbtn_phieuthu Phiếu thu

5 Devexpress.XtraBar.BarButtonItem Barbtn_phieuchi Phiếu chi

- Báo cáo-thống kê

Page 83: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 50 | 262

Hình 4.Hình ảnh giao diện báo cáo thống kê quản lý bán hàng

-Từ hình minh họa,chia làm ba phần:doanh thu,thống kê về hàng hóa,thống kê về

khách hàng và đại lý .

Các thành phần của giao diện:

STT Loại Control Đặt tên Nội dung Ghi

chú

1 Devexpress.XtraBar.BarButtonItem Barbtn_doanhthuhangth

ang

Doanh thu

hàng tháng

2 Devexpress.XtraBar.BarButtonItem Barbtn_thongketonkho Thống kê tồn

kho

3 Devexpress.XtraBar.BarButtonItem Barbtn_hangsaphethan Hàng sắp hết

hạn

4 Devexpress.XtraBar.BarButtonItem Barbtn_hanghetsoluong Hàng hết số

lượng

5 Devexpress.XtraBar.BarButtonItem Barbtn_hàng hư hỏng

và trả lại

Hàng hư hỏng

và trả lại

6

Devexpress.XtraBar.BarButtonItem Barbtn_daily_khachhan

g

Đại lý và

khách hàng

mua nhiều.

- Trợ giúp

Hình 5.hình ảnh giao diện trợ giúp của hệ thống quản lý bán hàng

-Các thành phần của giao diện.

STT Loại Control Đặt tên Nội dung Ghi

chú

1 Devexpress.XtraBar.BarButtonItem Barbtn_thongtintacgia Thông tin tác

giả

Page 84: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 51 | 262

2 Devexpress.XtraBar.BarButtonItem Barbtn_huongdansudung Hướng dẫn

sử dụng

IX.Tổ chức thư mục theo mô hình 3 lớp

i. Data, Bussiness, Presentation và tạo ra các lớp tương ứng

ii.Xử lý sự kiện

click trên form

main

-Ở đây,ta sẽ

không thiết lập

thuộc tính

IsMdiContainer

BUSSINESSLAYER:Chứa các

lớp ở tầng Bussiness

DATALAYER: Chứa các lớp ở

tầng Data

DTO:chứa các thông tin get/set

của các thuộc tính

KETNOI:chứa các lợp kết nối

của C# với sql server

REPORT:chứa các báo cáo-

thống kê

PRESENTATION:chứa các

giao diện.

Page 85: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 52 | 262

,mà ta sẽ sử dụng xtratabControl để gọi các form khác vào form main.

XtraTabControl là control được sử dụng khá phổ

biến của người lập trình.Là lọa tab chuyên dụng khi gọi

các form khác nhau vào form chính,vừa cân bằng được

kích thước của form,vừa tạo ra các tabpage tùy

biến,khiến cho giao diện form trở nên bắt mắt và dễ

nhìn.Hơn thế nữa,hỗ trợ quản lý tốt các form khi gọi

đồng loạy các form vào formmain một cách ngẫu nhiên.

Khi sử dụng XtraTabControl ,bạn phải tùy

chỉnh thuộc tính ClosePageButtonShowMod trong

properties thành

InActiveTabPageAndTabControlHeader

Để xuất hiện nút tắt x trên form mỗi khi bạn mở

form.Hơn nữa ,bạn phải viết sự kiện CloseButtonClick

để khi tắt tabpage form nào đó,nó sẽ nhảy về vị trị form

trước đó.

Mô phỏng khi gọi các form khác vào form main

bằng cách sử dụng đến thẻ control :Xtratabcontrol

Khi click chuột gọi form vào,thì XtraTab sẽ tạo ra tabpage để chứa không gian của

form được gọi.

Click vào

Page 86: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 53 | 262

Hình 6.Mô phỏng khi ta click vào Button nhân viên trong danh mục

Click vào

Page 87: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 54 | 262

Hình 2.Mô phỏng khi ta click vào Button phân công dự án trong nghiệp vụ

Hình 3.Mô phỏng khi ta click vào Button danh sách phòng ban trong báo cáo-thống kê

X.Nói thêm về thành phần thường sử dụng,đó là control :GridControl

- Đây là một control được sử dụng phổ biến ,với hình ảnh bắt mắt ,hỗ trợ nhiều tính năng

hơn so với vấn đề load dữ liệu lên datagridview hay listview,GridControl có những tính

điểm vượt trội hơn,cùng việc hỗ trợ ở các dạng layoutview khác nhau,giúp hiển thị dữ liệu

một cách sinh động và đẹp mắt theo ý thích của người dùng.

Ảnh minh họa về GridControl

Click vào

XtraReport

Page 88: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 55 | 262

GridControl đang ở dạng gridview

Chia thành các cột theo các thuộc tính trên form ,GridControl sẽ tạo các các cột

tương ứng và tùy chính theo người dùng.

Dòng đầu tiên,là chức năng autofilter trong GridControl ,dùng để lọc dữ liệu theo

điều kiện người dùng nhập vào theo từng cột.

- Khi bạn muốn thiết lập chế độ cột trong GridControl,bạn vào click chuột phải-

>Run Designer để thiết lập column hoặc các tùy chỉnh trong Property Editor.

- Bạn có thể tùy chỉnh các dạng view trong gridcontrol theo ý cách nhìn của mình.

- Có các thẻ tùy chỉnh trong Property Editor

+ View:chế độ khung nhìn

+ Column:Tùy chỉnh các cột

+ Feature Browser :Tùy chỉnh các thuộc tính đặc trưng của các ô hay các cột như

font chữ,….

+ Layout:Có thể sao lưu,phục hồi dạng layout đã tạo trước đó.

+Group Sumary Items:Nhóm đối tượng thống kê.

Page 89: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 56 | 262

- Ở GridControl bạn click vào dòng chữ màu xanh (Click here to change view) > Convert

to > LayoutView

Sau đó gridControl sẽ chuyển đổi như hình trên. Đối với trường hợp bạn load dữ liệu trực

tiếp vào grid thì các cột dữ liệu trong CSDL sẽ hiển thị vào grid để bạn có thể chỉnh sửa

luôn. Nhưng trường hợp này khi chạy lên grid mới được load dữ liệu nên không hiển thị gì

cả.

Page 90: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 57 | 262

Đây là màn hình khi chạy lên của grid, bạn có thể click vào các icon ở thanh công cụ phía

trên để chọn kiểu hiển thị các mẫu dữ liệu.

Để chỉnh sửa bố cục của cách trình bày dữ liệu bạn click vào icon setting cuối cùng

Page 91: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 58 | 262

Bạn có thể kéo thay đổi vị trí các cột dữ liệu trong cách hiển thị và nhấn nút Apply để áp

dụng thay đổi (lưu ý: trong trường hợp này chỉ là áp dụng tạm thời, nghĩa là bố cục này sẽ

mất khi đóng chương trình, nếu bạn muốn thay đổi vĩnh viễn thì phải load dữ liệu trực tiếp

vào grid và bạn làm tương tự bước này ngay trên design của grid thì mới được lưu áp dụng

vĩnh viển.

Nếu bạn muốn thay đổi nhãn của các cột dữ liệu thì click phải vào label rồi chọn Rename.

Sau khi xong rồi thì nhấn nút Apply để lưu. Đây là kết quả.

Page 92: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 59 | 262

Bạn cũng có thể tạo nhóm dữ liệu, chèn khoảng trắng, phân cách,... nhiều thứ nữa trong đó.

Page 93: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 60 | 262

Để thay đổi chế độ hiển thị dữ liệu bằng code bạn sử dụng câu lệnh sau:

XI.Giới thiệu sơ lược về XtraReport

-Một cách tạo Report cũng đang phổ biến sử dụng.Bằng cách thiết kế sẵn các lệnh,các

table chứa các control phù hợp,sau đó ta có thể gắn nguồn(source) cho các xrtable(được hỗ

trợ trong xtrareport).

-Một công cụ giúp tạo ra trang report đẹp mắt,lại mang tính tiện dụng.Tại vì nếu thông

thường,ta luôn thiết kế theo CrytallReport ,nếu thiết kế theo cách đó,khi chuyển chương

trình sang máy khác thì bắt buộc máy tính đó phải được cài CrytallReport trong máy.

Chúng ta sẽ xét cách tạo Xtrareport

- Click phải vào solution->Add->New Item->Reporting->DxExperience v12.2

Report Wizard

Page 94: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 61 | 262

- Sau khi bạn đánh tên XtraReport ,chọn Add.

Bạn sẽ thấy một khung nhìn về XtraReport như sau:

- Để thiết kế các thành phần trong XtraReport,bạn sử dụng các thẻ

trong toolbox

- Trong XtraReport gồm có 7 phần:

+ Page header/footer :chứa tiều đề đầu trang và cuối trang.

Page 95: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 62 | 262

+ Report header/footer:Tiêu đề đầu và cuối report ,nội dung đặt trong report

header/footer chỉ xuất hiện ở phần đầu của trang đầu tiên và phần cuối trang của

trang cuối cùng.Các nội dung thường đặt trong report header/Footer.

+ Detail:Chứa nguồn dữ liệu của report.

+Group Header/Footer: Đối với các report giống như dạng form dạng main_sub thì

phải có thêm phần kết nhóm là group header/footer.Nội dung của phần group

header/footer là tiêu đề của nhóm.Có thể thống kê dữ liệu theo nhóm.

XII.Đặt câu hỏi trắc nghiệm và lý thuyết.

A.Câu hỏi trắc nghiệm

1.Thanh menu chứa các mục như hệ thống,danh mục.nghiệp vụ,trợ giúp,…được gọi là gì?

A.RibbonControl B.RibbonForm

C.NavBarControl D.DevexpressRibbon

2.Để tạo ra RibbonPage trong form DevExpress,ta chọn:

A.Add Item B.Add Group

C.Add Page D.Add pageGroup

3.Đê thiết lập thuộc tính form cha/form con,ta chọn thuộc tính và giá trị gì trong properties.

A. IsMdiContainer:True B.ApplicationIcon:None

Page 96: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 63 | 262

C. IsMdiContainer:False D.Tất cả đều sai

4.Để thiết lập report,ngoài cách chọn CrytalReport,ta có thể chọn Report gì trong

Devexpress.

A.XtraReport B.CreateDocument

C.PrintBarManager D.XtraTabControl

5.GridControl chỉ có một dạng hiển thị ở dạng GridView

A.Đúng B.Sai

6.GridControl có thuộc tính gì để lọc dữ liệu tự động.

A.AutoMark B.AutoControl

C.AutoFilter D.Tất cả đều đúng

7.Khi tạo Form Wizard,để lưu trữ hình ảnh và đặt các hình ảnh cho các BarButtonItem,ta

có thể sử dụng Control nào?

A.ImageCollectionSmall B.ImageCollectionLarge

C.ImageList D.A & B đúng

B.Câu hỏi lý thuyết

1.Để tạo ra ký hiệu tắt x trong XtraTabControl,ta chọn thuộc tính gì trong properties của

XtraTabControl.

2.XtraReport là một Item mình add vào form hay tồn tại sẵn trong ToolBox trong

Devexpress.

3.Để thay đổi dạng hiển thị của GridControl,ta làm như thế nào?Làm thế nào để chọn hình

ảnh cho các đối tượng trong RibbonControl?

XIII.Bảng phân công chi tiết công việc

STT Tên thành viên Phụ trách

1 Lê Hồng Tơ

+ Tìm hiểu về cách xây dựng form bằng UserControl

+ Phân tích cơ sở dữ liệu để thiết kế quản lý bán hàng

+ Xây dựng mô hình 3 lớp.

2 Phạm Văn Ây

+ Cách thay đổi ApplicationIcon của Ribbon

+ Cách AddGroup và AddItem trong NavBarControl

+ Cách thiết lập IsMdiContainer

+ Tìm kiếm tài liệu từ nhóm khác

Page 97: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 64 | 262

3 Lê Nguyễn Thành Trung

+ Tìm hiểu về cách sử dụng XtraTabControl

+ Hỗ trợ đặt câu hỏi

+ Tìm hiểu về cách bố trí thành phần trong form

+ Tìm các tài liệu tham khảo trên Internet

4 Bùi Thị Chinh

+ Tìm hiểu và cài đặ phiên bản Devexpress 12.2.7

+ Tìm hiểu về cách add Image vào các đối tượng trong

form

+ Tìm hiểu về thành phần ImageCollection

+ Xây dựng thành công XtraReport trong form

+ Phân tích cơ sở dữ liệu

+ Chỉnh sửa Word.

+ Góp ý trang trí giao diện theo từng nhóm.

+ Thiết kế Powerpoint

5 Nguyễn Hữu Phước

+ Chỉnh sửa,góp ý

+ Code phần XtraTabControl và XtraReport

+ Phân tích cơ sở dữ liệu

+ Xây dựng mô hình dữ liệu quản lý khách hàng.

+ Quay Video

XIV.Thống kê chia sẻ tài liệu

STT Nhóm đã chia sẻ Ngày chia sẻ

1 Nhóm 3 11/04/2014

2 Nhóm 6 14/04/2014

XV.Kết luận và tài liệu tham khảo

A.Kết luận

Nhóm đã hoàn thành:

- Nhóm đã hoàn thành cơ bản về cách dàn form trên phiên bản Devexpress 12.2.7.Tìm hiểu

về cách xây dựng mô hình 3 lớp một cách cụ thể.

- Cách bố trí trên form menu hiện đại một cách phù hợp theo từng nhóm.Cách thiết kế Icon

cho form được đẹp và bắt mắt hơn.

- Hiểu được các chế độ view của GridControl và cách tùy chỉnh theo ý thích của người

dùng.

- Tìm hiểu được nhiều Control trong

Devexpress:NavBarControl,XtraTabControl,RibbonControl .

Page 98: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 65 | 262

- Xây dựng được form quản lý bán hàng theo mô hình 3 lớp và cách bố trí theo menu hiện

đại.

B.Tài liệu tham khảo

[1].http://thuthuatso1.info/@forum/threads/huong-dan-addtab-con-dong-vao-

xtratabcontrol-trong-devexpress.4206.html

[2]. http://www.youtube.com/watch?v=h1f8ob0gSwQ

[3]. http://www.devexpress.com/

[4]. https://documentation.devexpress.com/#HomePage/CustomDocument9453

Page 99: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 66 | 262

Trong ngành kỹ nghệ phần mềm, năm 1979, có một quy tắc nổi tiếng là: “Trong

một dự án lập trình điển hình, thì xấp xỉ 50% thời gian và hơn 50% tổng chi phí

được sử dụng trong kiểm thử các chương trình hay hệ thống đã được phát triển”. Và

cho đến nay, sau gần một phần 3 thế kỷ, quy tắc đó vẫn còn đúng. Đã có rất nhiều

ngôn ngữ, hệ thống phát triển mới với các công cụ tích hợp cho các lập trình viên sử

dụng phát triển ngày càng linh động. Nhưng kiểm thử vẫn đóng vai trò hết sức quan

trọng trong bất kỳ dự án phát triển phần mềm nào.

Rất nhiều các giáo sư, giảng viên đã từng than phiền rằng: “ Sinh viên của chúng ta

tốt nghiệp và đi làm mà không có được những kiến thực thực tế cần thiết về cách để

kiểm thử một chương trình. Hơn nữa, chúng ta hiếm khi có được những lời khuyên

bổ ích để cung cấp trong các khóa học mở đầu về cách một sinh viên nên làm về

kiểm thử và gỡ lỗi các bài tập của họ”.

Các tác giả của cuốn sách nổi tiếng “The Art of Software Testing” – Nghệ thuật

kiểm thử phần mềm, Glenford J. Myers, Tom Badgett, Todd M. Thomas, Corey

Sandler đã khẳng định trong cuốn sách của mình rằng: “ Hầu hết các thành phần

quan trọng trong các thủ thuật của một nhà kiểm thử chương trình là kiến thức về

cách để viết các ca kiểm thử có hiệu quả”. Việc xây dựng các test – case là một

nhiệm vụ rất khó khăn. Để có thể xây dựng được tập các test – case hữu ích cho

kiểm thử, chúng ta cần rất nhiều kiến thức và kinh nghiệm

Đó là những lý do thúc đẩy chúng em thực hiện đề tài này. Mục đích của đề tài là

tìm hiểu những kiến thức tổng quan nhất về kiểm thử, và cách thiết kế test – case

trong kiểm thử phần mềm. Việc thực hiện đề tài sẽ giúp chúng em tìm hiểu sâu hơn

và lĩnh vực rất hấp dẫn này, vận dụng được các kiến thức đã học để có thể thiết kế

được các test – case một cách có hiệu quả và áp dụng vào những bài toán thực tế.

Page 100: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 67 | 262

MỤC LỤC

CHƯƠNG 1. TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM .............................................................. 68

1.1 Các khái niệm cơ bản về kiểm thử phần mềm ................................................................. 68

1.1.1 Kiểm thử phần mềm là gì? ........................................................................................... 68

1.1.2 Các phương pháp kiểm thử .......................................................................................... 68

1.1.3 Các chiến lược kiểm thử ............................................................................................. 69

1.1.4 Các cấp độ kiểm thử phần mềm .................................................................................. 71

1.1.5 Các phương pháp kiểm thử con người ........................................................................ 76

1.2 Nguyên tắc kiểm thử phần mềm ...................................................................................... 77

CHƯƠNG 2. THIẾT KẾ TEST – CASE ........................................................................................... 79

2.1 Khái niệm .......................................................................................................................... 79

2.2 Vai trò của thiết kế test – case ......................................................................................... 79

2.3 Quy trình thiết kế test – case ........................................................................................... 79

2.3.1 Kiểm thử hộp trắng - Kiểm thử bao phủ logic . ............................................................ 13

2.3.2 Kiểm thử hộp đen......................................................................................................... 19

2.3.3 Chiến lược .................................................................................................................... 27

KẾT LUẬN .......................................................................................................................................... 28

TÀI LIỆU THAM KHẢO ....................................................................................................................... 29

CÂU HỎI ................................................................................................ Error! Bookmark not defined.

Page 101: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 68 | 262

TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM

Các khái niệm cơ bản về kiểm thử phần mềm

Kiểm thử phần mềm là gì?

Kiểm thử phần mềm là quá trình khảo sát một hệ thống hay thành phần dưới những

điều kiện xác định, quan sát và ghi lại các kết quả, và đánh giá một khía cạnh nào

đó của hệ thống hay thành phần đó. (Theo Bảng chú giải thuật ngữ chuẩn IEEE của

Thuật ngữ kỹ nghệ phần mềm- IEEE Standard Glossary of Software Engineering

Terminology).

Kiểm thử phần mềm là quá trình thực thi một chương trình với mục đích tìm lỗi.

(Theo “The Art of Software Testing” – Nghệ thuật kiểm thử phần mềm).

Kiểm thử phần mềm là hoạt động khảo sát thực tiễn sản phẩm hay dịch vụ phần

mềm trong đúng môi trường chúng dự định sẽ được triển khai nhằm cung cấp cho

người có lợi ích liên quan những thông tin về chất lượng của sản phẩm hay dịch vụ

phần mềm ấy. Mục đích của kiểm thử phần mềm là tìm ra các lỗi hay khiếm khuyết

phần mềm nhằm đảm bảo hiệu quả hoạt động tối ưu của phần mềm trong nhiều

ngành khác nhau. (Theo Bách khoa toàn thư mở Wikipedia).

Có thể định nghĩa một cách dễ hiểu như sau: Kiểm thử phần mềm là một tiến trình

hay một tập hợp các tiến trình được thiết kế để đảm bảo mã hóa máy tính thực hiện

theo cái mà chúng đã được thiết kế để làm, và không thực hiện bất cứ thứ gì không

mong muốn. Đây là một pha quan trọng trong quá trình phát triển hệ thống, giúp

cho người xây dựng hệ thống và khách hàng thấy được hệ thống mới đã đáp ứng

yêu cầu đặt ra hay chưa?

Các phương pháp kiểm thử

Có 2 phương pháp kiểm thử chính là: Kiểm thử tĩnh và Kiểm thử động.

Kiểm thử tĩnh – Static testing

Là phương pháp thử phần mềm đòi hỏi phải duyệt lại các yêu cầu và các đặc tả

bằng tay, thông qua việc sử dụng giấy, bút để kiểm tra logic, lần từng chi tiết mà

không cần chạy chương trình. Kiểu kiểm thử này thường được sử dụng bởi chuyên

viên thiết kế người mà viết mã lệnh một mình.

Kiểm thử tĩnh cũng có thể được tự động hóa. Nó sẽ thực hiện kiểm tra toàn bộ bao

gồm các chương trình được phân tích bởi một trình thông dịch hoặc biên dịch mà

xác nhận tính hợp lệ về cú pháp của chương trình.

Page 102: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 69 | 262

Kiểm thử động – Dynamic testing

Là phương pháp thử phần mềm thông qua việc dùng máy chạy chương trình để điều

tra trạng thái tác động của chương trình. Đó là kiểm thử dựa trên các ca kiểm thử

xác định bằng sự thực hiện của đối tượng kiểm thử hay chạy các chương trình.

Kiểm thử động kiểm tra cách thức hoạt động động của mã lệnh, tức là kiểm tra sự

phản ứng vật lý từ hệ thống tới các biến luôn thay đổi theo thời gian. Trong kiểm

thử động, phần mềm phải thực sự được biên dịch và chạy. Kiểm thử động thực sự

bao gồm làm việc với phần mềm, nhập các giá trị đầu vào và kiểm tra xem liệu đầu

ra có như mong muốn hay không. Các phương pháp kiểm thử động gồm có kiểm

thử Unit – Unit Tests, Kiểm thử tích hợp – Intergration Tests, Kiểm thử hệ thống –

System Tests, và Kiểm thử chấp nhận sản phẩm – Acceptance Tests.

CÁC CHIẾN LƯỢC KIỂM THỬ

BA TRONG SỐ NHỮNG CHIẾN ƯỢC KIỂM THỬ THÔNG DỤNG NHẤT BAO GỒM:

KIỂM THỬ HỘP ĐEN, KIỂM THỬ HỘP TRẮNG, VÀ KIỂM THỬ HỘP XÁM.

KIỂM THỬ HỘP ĐEN – BLACK BOX TESTING

MỘT TRONG NHỮNG CHIẾN ƯỢC KIỂM THỬ QUAN TRỌNG LÀ KIỂM THỬ HỘP

ĐEN, HƯỚNG DỮ LIỆU, HAY HƯỚNG VÀO/RA. KIỂM THỬ HỘP ĐEN E CHƯƠNG

TRÌNH NHƯ À ỘT “HỘP ĐEN”. MỤC ĐÍCH CỦA BẠN LÀ HOÀN TOÀN KHÔNG

QUAN TÂM VỀ CÁCH CƯ Ử VÀ CẤU TRÚC BÊN TRONG CỦA CHƯƠNG TRÌNH.

THAY VÀO ĐÓ, TẬP TRUNG VÀO TÌM CÁC TRƯỜNG HỢP À CHƯƠNG TRÌNH

KHÔNG THỰC HIỆN THEO CÁC ĐẶC TẢ CỦA NÓ.

THEO HƯỚNG TIẾP CẬN NÀY, DỮ LIỆU KIỂ TRA ĐƯỢC LẤY CHỈ TỪ CÁC ĐẶC

TẢ.

CÁC PHƯƠNG PHÁP KIỂM THỬ HỘP ĐEN:

PHÂN LỚP TƯƠNG ĐƯƠNG – EQUIVALENCE PARTITIONING.

PHÂN TÍCH GIÁ TRỊ BIÊN – BOUNDARY VALUE ANALYSIS.

KIỂM THỬ MỌI CẶP – ALL-PAIRS TESTING.

KIỂM THỬ FUZZ – FUZZ TESTING.

KIỂM THỬ DỰA TRÊN MÔ HÌNH – MODEL-BASED TESTING.

MA TRẬN DẤU VẾT – TRACEABILITY MATRIX.

KIỂM THỬ THĂ Ò – EXPLORATORY TESTING.

KIỂM THỬ DỰA TRÊN ĐẶC TẢ – SPECIFICATION-BASE TESTING.

Page 103: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 70 | 262

KIỂM THỬ DỰA TRÊN ĐẶC TẢ TẬP TRUNG VÀO KIỂM TRA TÍNH THIẾT THỰC

CỦA PHẦN MỀM THEO NHỮNG YÊU CẦU THÍCH HỢP. DO ĐÓ, KIỂM THỬ VIÊN

NHẬP DỮ LIỆU VÀO, VÀ CHỈ THẤY DỮ LIỆU RA TỪ ĐỐI TƯỢNG KIỂM THỬ. MỨC

KIỂM THỬ NÀY THƯỜNG YÊU CẦU CÁC CA KIỂM THỬ TRIỆT ĐỂ ĐƯỢC CUNG

CẤP CHO KIỂM THỬ VIÊN À KHI ĐÓ CÓ THỂ ÁC INH À ĐỐI VỚI DỮ LIỆU

ĐẦU VÀO ĐÃ CHO, GIÁ TRỊ ĐẦU RA (HAY CÁCH THỨC HOẠT ĐỘNG) CÓ GIỐNG

VỚI GIÁ TRỊ MONG MUỐN ĐÃ ĐƯỢC ÁC ĐỊNH TRONG CA KIỂM THỬ ĐÓ HAY

KHÔNG. KIỂM THỬ DỰA TRÊN ĐẶC TẢ LÀ CẦN THIẾT, NHƯNG KHÔNG ĐỦ ĐỂ

ĐỂ NGĂN CHẶN NHỮNG RỦI RO CHẮC CHẮN.

ƯU, NHƯỢC ĐIỂM:

KIỂM THỬ HỘP ĐEN KHÔNG CÓ ỐI LIÊN QUAN NÀO TỚI MÃ LỆNH, VÀ KIỂM

THỬ VIÊN CHỈ RẤT ĐƠN GIẢN TÂM NIỆM LÀ: MỘT MÃ LỆNH PHẢI CÓ LỖI. SỬ

DỤNG NGUYÊN TẮC “ HÃY ĐÒI HỎI VÀ BẠN SẼ ĐƯỢC NHẬN”, NHỮNG KIỂM THỬ

VIÊN HỘP ĐEN TÌM RA LỖI MÀ NHỮNG LẬP TRÌNH VIÊN ĐÃ KHÔNG TÌM RA.

NHƯNG, MẶT KHÁC, NGƯỜI TA CŨNG NÓI KIỂM THỬ HỘP ĐEN “GIỐNG NHƯ À

ĐI TRONG BÓNG TỐI À KHÔNG CÓ ĐÈN VẬY”, BỞI VÌ KIỂM THỬ VIÊN KHÔNG

BIẾT CÁC PHẦN MỀ ĐƯỢC KIỂM TRA THỰC SỰ ĐƯỢC XÂY DỰNG NHƯ THẾ

NÀO. ĐÓ LÀ LÝ DO MÀ CÓ NHIỀU TRƯỜNG HỢP MÀ MỘT KIỂM THỬ VIÊN HỘP

ĐEN VIẾT RẤT NHIỀU CA KIỂM THỬ ĐỂ KIỂM TRA MỘT THỨ GÌ ĐÓ À ĐÁNG Ẽ

CÓ THỂ CHỈ CẦN KIỂM TRA BẰNG 1 CA KIỂM THỬ DUY NHẤT, VÀ/HOẶC MỘT SỐ

PHẦN CỦA CHƯƠNG TRÌNH KHÔNG ĐƯỢC KIỂM TRA CHÚT NÀO.

DO VẬY, KIỂM THỬ HỘP ĐEN CÓ ƯU ĐIỂM CỦA “MỘT SỰ ĐÁNH GIÁ KHÁCH

QUAN”, MẶT KHÁC NÓ LẠI CÓ NHƯỢC ĐIỂM CỦA “THĂ Ò Ù”.

Kiểm thử hộp trắng – White box testing

Là một chiến lược kiểm thử khác, trái ngược hoàn toàn với kiểm thử hộp đen, kiểm

thử hộp trắng hay kiểm thử hướng logic cho phép bạn khảo sát cấu trúc bên trong

của chương trình. Chiến lược này xuất phát từ dữ liệu kiểm thử bằng sự kiểm thử

tính logic của chương trình. Kiểm thử viên sẽ truy cập vào cấu trúc dữ liệu và giải

thuật bên trong chương trình (và cả mã lệnh thực hiện chúng).

Cá phương pháp kiểm thử hộp trắng

Kiểm thử giao diện lập trình ứng dụng - API testing (application

programming interface): là phương pháp kiểm thử của ứng dụng sử

dụng các API công khai và riêng tư.

Bao phủ mã lệnh – Code coverage: tạo các kiểm tra để đáp ứng một số

tiêu chuẩn về bao phủ mã lệnh.

Các phương pháp gán lỗi – Fault injection.

Page 104: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 71 | 262

Các phương pháp kiểm thử hoán chuyển – Mutation testing methods.

Kiểm thử tĩnh – Static testing: kiểm thử hộp trắng bao gồm mọi kiểm

thử tĩnh.

Phương pháp kiểm thử hộp trắng cũng có thể được sử dụng để đánh giá sự hoàn

thành của một bộ kiểm thử mà được tạo cùng với các phương pháp kiểm thử hộp

đen. Điều này cho phép các nhóm phần mềm khảo sát các phần của 1 hệ thống ít khi

được kiểm tra và đảm bảo rằng những điểm chức năng quan trọng nhất đã được

kiểm tra.

Kiểm thử hộp xám – Gray box testing

Kiểm thử hộp xám đòi hỏi phải có sự truy cập tới cấu trúc dữ liệu và giải thuật bên

trong cho những mục đích thiết kế các ca kiểm thử, nhưng là kiểm thử ở mức người

sử dụng hay mức hộp đen. Việc thao tác tới dữ liệu đầu vào và định dạng dữ liệu

đầu ra là không rõ ràng, giống như một chiếc “hộp xám”, bởi vì đầu vào và đầu ra

rõ ràng là ở bên ngoài “hộp đen” mà chúng ta vẫn gọi về hệ thống được kiểm tra.

Sự khác biệt này đặc biệt quan trọng khi quản lý kiểm thử tích hợp – Intergartion

testing giữa 2 modun mã lệnh được viết bởi hai chuyên viên thiết kế khác nhau,

trong đó chỉ giao diện là được đưa ra để kiểm thử. Kiểm thử hộp xám có thể cũng

bao gồm cả thiết kế đối chiếu để quyết định, ví dụ, giá trị biên hay thông báo lỗi.

Các cấp độ kiểm thử phần mềm

Kiểm thử phần mềm gồm có các cấp độ: Kiểm thử đơn vị, Kiểm thử tích hợp, Kiểm

thử hệ thống và Kiểm thử chấp nhận sản phẩm.

Hình 1.1 Sơ đồ các cấp độ kiểm thử

Page 105: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 72 | 262

Kiểm thử đơn vị – Unit test

Một đơn vị là một thành phần phần mềm nhỏ nhất mà ta có thể kiểm thử được. Ví

dụ, các hàm (Function), thủ tục (Procedure), lớp (Class) hay phương thức (Method)

đều có thể được xem là Unit.

Vì Unit được chọn để kiểm tra thường có kích thước nhỏ và chức năng hoạt động

đơn giản, chúng ta không khó khăn gì trong việc tổ chức kiểm thử, ghi nhận và

phân tích kết quả kiểm thử. Nếu phát hiện lỗi, việc xác định nguyên nhân và khắc

phục cũng tương đối dễ dàng vì chỉ khoanh vùng trong một đơn thể Unit đang kiểm

tra. Một nguyên lý đúc kết từ thực tiễn: thời gian tốn cho Unit Test sẽ được đền bù

bằng việc tiết kiệm rất nhiều thời gian và chi phí cho việc kiểm thử và sửa lỗi ở các

mức kiểm thử sau đó.

Unit Test thường do lập trình viên thực hiện. Công đoạn này cần được thực hiện

càng sớm càng tốt trong giai đoạn viết code và xuyên suốt chu kỳ phát triển phần

mềm. Thông thường, Unit Test đòi hỏi kiểm thử viên có kiến thức về thiết kế và

code của chương trình. Mục đích của Unit Test là bảo đảm thông tin được xử lý và

xuất (khỏi Unit) là chính xác, trong mối tương quan với dữ liệu nhập và chức năng

của Unit. Điều này thường đòi hỏi tất cả các nhánh bên trong Unit đều phải được

kiểm tra để phát hiện nhánh phát sinh lỗi. Một nhánh thường là một chuỗi các lệnh

được thực thi trong một Unit. Ví dụ: chuỗi các lệnh sau điều kiện If và nằm giữa

then ... else là một nhánh. Thực tế việc chọn lựa các nhánh để đơn giản hóa việc

kiểm thử và quét hết Unit đòi hỏi phải có kỹ thuật, đôi khi phải dùng thuật toán để

chọn lựa.

Cùng với các mục kiểm thử khác, Unit Test cũng đòi hỏi phải chuẩn bị trước các ca

kiểm thử (Test case) hoặc kịch bản kiểm thử (Test script), trong đó chỉ định rõ dữ

liệu đầu vào, các bước thực hiện và dữ liệu đầu ra mong muốn. Các Test case và

Test script này nên được giữ lại để tái sử dụng.

Kiểm thử tích hợp – Intergration Test

Integration test kết hợp các thành phần của một ứng dụng và kiểm thử như một ứng

dụng đã hoàn thành. Trong khi Unit Test kiểm tra các thành phần và Unit riêng lẻ

thì Intgration Test kết hợp chúng lại với nhau và kiểm tra sự giao tiếp giữa chúng.

Hai mục tiêu chính của Integration Test:

Phát hiện lỗi giao tiếp xảy ra giữa các Unit.

Tích hợp các Unit đơn lẻ thành các hệ thống nhỏ (Subsystem) và cuối

cùng là nguyên hệ thống hoàn chỉnh (System) chuẩn bị cho kiểm thử ở

mức hệ thống (System Test).

Page 106: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 73 | 262

Trong Unit Test, lập trình viên cố gắng phát hiện lỗi liên quan đến chức năng và cấu

trúc nội tại của Unit. Có một số phép kiểm thử đơn giản trên giao tiếp giữa Unit với

các thành phần liên quan khác, tuy nhiên mọi giao tiếp liên quan đến Unit chỉ thật

sự được kiểm tra đầy đủ khi các Unit tích hợp với nhau trong khi thực hiện

Integration Test.

Trừ một số ít ngoại lệ, Integration Test chỉ nên thực hiện trên những Unit đã được

kiểm tra cẩn thận trước đó bằng Unit Test, và tất cả các lỗi mức Unit đã được sửa

chữa. Một số người hiểu sai rằng Unit một khi đã qua giai đoạn Unit Test với các

giao tiếp giả lập thì không cần phải thực hiện Integration Test nữa. Thực tế việc tích

hợp giữa các Unit dẫn đến những tình huống hoàn toàn khác.

Một chiến lược cần quan tâm trong Integration Test là nên tích hợp dần từng Unit.

Một Unit tại một thời điểm được tích hợp vào một nhóm các Unit khác đã tích hợp

trước đó và đã hoàn tất các đợt Integration Test trước đó. Lúc này, ta chỉ cần kiểm

thử giao tiếp của Unit mới thêm vào với hệ thống các Unit đã tích hợp trước đó,

điều này sẽ làm cho số lượng can kiểm thử giảm đi rất nhiều, và sai sót sẽ giảm

đáng kể.

Có 4 loại kiểm thử trong Integration Test:

Kiểm thử cấu trúc (Structure Test): Tương tự White Box Test, kiểm thử

cấu trúc nhằm bảo đảm các thành phần bên trong của một chương trình

chạy đúng và chú trọng đến hoạt động của các thành phần cấu trúc nội

tại của chương trình chẳng hạn các câu lệnh và nhánh bên trong.

Kiểm thử chức năng (Functional Test): Tương tự Black Box Test, kiểm

thử chức năng chỉ chú trọng đến chức năng của chương trình, mà không

quan tâm đến cấu trúc bên trong, chỉ khảo sát chức năng của chương

trình theo yêu cầu kỹ thuật.

Kiểm thử hiệu năng (Performance Test): Kiểm thử việc vận hành của

hệ thống.

Kiểm thử khả năng chịu tải (Stress Test): Kiểm thử các giới hạn của hệ

thống.

Kiểm thử hệ thống – System Test

Mục đích System Test là kiểm thử thiết kế và toàn bộ hệ thống (sau khi tích hợp) có

thỏa mãn yêu cầu đặt ra hay không.

Page 107: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 74 | 262

System Test bắt đầu khi tất cả các bộ phận của phần mềm đã được tích hợp thành

công. Thông thường loại kiểm thử này tốn rất nhiều công sức và thời gian. Trong

nhiều trường hợp, việc kiểm thử đòi hỏi một số thiết bị phụ trợ, phần mềm hoặc

phần cứng đặc thù, đặc biệt là các ứng dụng thời gian thực, hệ thống phân bố, hoặc

hệ thống nhúng. Ở mức độ hệ thống, người kiểm thử cũng tìm kiếm các lỗi, nhưng

trọng tâm là đánh giá về hoạt động, thao tác, sự tin cậy và các yêu cầu khác liên

quan đến chất lượng của toàn hệ thống.

Điểm khác nhau then chốt giữa Integration Test và System Test là System Test chú

trọng các hành vi và lỗi trên toàn hệ thống, còn Integration Test chú trọng sự giao

tiếp giữa các đơn thể hoặc đối tượng khi chúng làm việc cùng nhau. Thông thường

ta phải thực hiện Unit Test và Integration Test để bảo đảm mọi Unit và sự tương tác

giữa chúng hoạt động chính xác trước khi thực hiện System Test.

Sau khi hoàn thành Integration Test, một hệ thống phần mềm đã được hình thành

cùng với các thành phần đã được kiểm tra đầy đủ. Tại thời điểm này, lập trình viên

hoặc kiểm thử viên bắt đầu kiểm thử phần mềm như một hệ thống hoàn chỉnh. Việc

lập kế hoạch cho System Test nên bắt đầu từ giai đoạn hình thành và phân tích các

yêu cầu.

System Test kiểm thử cả các hành vi chức năng của phần mềm lẫn các yêu cầu về

chất lượng như độ tin cậy, tính tiện lợi khi sử dụng, hiệu năng và bảo mật. Mức

kiểm thử này đặc biệt thích hợp cho việc phát hiện lỗi giao tiếp với phần mềm hoặc

phần cứng bên ngoài, chẳng hạn các lỗi "tắc nghẽn" (deadlock) hoặc chiếm dụng bộ

nhớ. Sau giai đoạn System Test, phần mềm thường đã sẵn sàng cho khách hàng

hoặc người dùng cuối cùng kiểm thử chấp nhận sản phẩm (Acceptance Test) hoặc

dùng thử (Alpha/Beta Test).

Đòi hỏi nhiều công sức, thời gian và tính chính xác, khách quan, System Test

thường được thực hiện bởi một nhóm kiểm thử viên hoàn toàn độc lập với nhóm

phát triển dự án. Bản thân System Test lại gồm nhiều loại kiểm thử khác nhau, phổ

biến nhất gồm:

Kiểm thử chức năng (Functional Test): Bảo đảm các hành vi của hệ

thống thỏa mãn đúng yêu cầu thiết kế.

Kiểm thử hiệu năng (Performance Test): Bảo đảm tối ưu việc phân bổ

tài nguyên hệ thống (ví dụ bộ nhớ) nhằm đạt các chỉ tiêu như thời gian

xử lý hay đáp ứng câu truy vấn...

Kiểm thử khả năng chịu tải (Stress Test hay Load Test): Bảo đảm hệ

thống vận hành đúng dưới áp lực cao (ví dụ nhiều người truy xuất cùng

lúc). Stress Test tập trung vào các trạng thái tới hạn, các "điểm chết",

Page 108: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 75 | 262

các tình huống bất thường như đang giao dịch thì ngắt kết nối (xuất

hiện nhiều trong kiểm tra thiết bị như POS, ATM...)...

Kiểm thử cấu hình (Configuration Test).

Kiểm thử bảo mật (Security Test): Bảo đảm tính toàn vẹn, bảo mật của

dữ liệu và của hệ thống.

Kiểm thử khả năng phục hồi (Recovery Test): Bảo đảm hệ thống có khả

năng khôi phục trạng thái ổn định trước đó trong tình huống mất tài

nguyên hoặc dữ liệu; đặc biệt quan trọng đối với các hệ thống giao dịch

như ngân hàng trực tuyến...

Nhìn từ quan điểm người dùng, các cấp độ kiểm thử trên rất quan trọng: Chúng bảo

đảm hệ thống đủ khả năng làm việc trong môi trường thực.

Lưu ý là không nhất thiết phải thực hiện tất cả các loại kiểm thử nêu trên. Tùy yêu

cầu và đặc trưng của từng hệ thống, tuỳ khả năng và thời gian cho phép của dự án,

khi lập kế hoạch, người Quản lý dự án sẽ quyết định áp dụng những loại kiểm thử

nào.

Kiểm thử chấp nhận sản phẩm – Acceptance Test

Thông thường, sau giai đoạn System Test là Acceptance Test, được khách hàng

thực hiện (hoặc ủy quyền cho một nhóm thứ ba thực hiện). Mục đích của

Acceptance Test là để chứng minh phần mềm thỏa mãn tất cả yêu cầu của khách

hàng và khách hàng chấp nhận sản phẩm (và trả tiền thanh toán hợp đồng).

Acceptance Test có ý nghĩa hết sức quan trọng, mặc dù trong hầu hết mọi trường

hợp, các phép kiểm thử của System Test và Acceptance Test gần như tương tự,

nhưng bản chất và cách thức thực hiện lại rất khác biệt.

Đối với những sản phẩm dành bán rộng rãi trên thị trường cho nhiều người sử dụng,

thông thường sẽ thông qua hai loại kiểm thử gọi là kiểm thử Alpha – Alpha Test và

kiểm thử Beta – Beta Test. Với Alpha Test, người dùng kiểm thử phần mềm ngay

tại nơi phát triển phần mềm, lập trình viên sẽ ghi nhận các lỗi hoặc phản hồi, và lên

kế hoạch sửa chữa. Với Beta Test, phần mềm sẽ được gửi tới cho người dùng để

kiểm thử ngay trong môi trường thực, lỗi hoặc phản hồi cũng sẽ gửi ngược lại cho

lập trình viên để sửa chữa.

Thực tế cho thấy, nếu khách hàng không quan tâm và không tham gia vào quá trình

phát triển phần mềm thì kết quả Acceptance Test sẽ sai lệch rất lớn, mặc dù phần

mềm đã trải qua tất cả các kiểm thử trước đó. Sự sai lệch này liên quan đến việc

hiểu sai yêu cầu cũng như sự mong chờ của khách hàng. Ví dụ đôi khi một phần

Page 109: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 76 | 262

mềm xuất sắc vượt qua các phép kiểm thử về chức năng thực hiện bởi nhóm thực

hiện dự án, nhưng khách hàng khi kiểm thử sau cùng vẫn thất vọng vì bố cục màn

hình nghèo nàn, thao tác không tự nhiên, không theo tập quán sử dụng của khách

hàng v.v...

Gắn liền với giai đoạn Acceptance Test thường là một nhóm những dịch vụ và tài

liệu đi kèm, phổ biến như hướng dẫn cài đặt, sử dụng v.v... Tất cả tài liệu đi kèm

phải được cập nhật và kiểm thử chặt chẽ.

Một số cấp độ kiểm thử khác

Ngoài các cấp độ trên, còn một số cấp độ kiểm thử khác như:

Kiểm thử hồi quy – Regression Testing:

Theo chuẩn IEEE610.12-90, kiểm thử hồi quy là “sự kiểm tra lại có lựa chọn của

một hệ thống hay thành phần để xác minh là những sự thay đổi không gây ra những

hậu quả không mong muốn…”. Trên thực tế, quan niệm này là chỉ ra rằng phần

mềm mà đã qua được các kiểm tra trước đó vẫn có thể được kiểm tra lại. Beizer

định nghĩa đó là sự lặp lại các kiểm tra để chỉ ra rằng cách hoạt động của phần mềm

không bị thay đổi, ngoại trừ tới mức như yêu cầu. Hiển nhiên là sự thỏa hiệp phải

được thực hiện giữa sự đảm bảo được đưa ra bởi kiểm thử hồi quy mỗi lần thực

hiện một sự thay đổi và những tài nguyên được yêu cầu thực hiện điều đó.

Kiểm thử tính đúng – Correctness testing:

Tính đúng đắn là yêu cầu tối thiểu của phần mềm, là mục đích chủ yếu của kiểm

thử. Kiểm thử tính đúng sẽ cần một kiểu người đáng tin nào đó, để chỉ ra cách hoạt

động đúng đắn từ cách hoạt động sai lầm. Kiểm thử viên có thể biết hoặc không biết

các chi tiết bên trong của các modun phần mềm được kiểm thử, ví dụ luồng điều

khiển, luông dữ liệu, v.v …. Do đó, hoặc là quan điểm hộp trắng, hoặc là quan điểm

hộp đen có thể được thực hiện trong kiểm thử phần mềm.

Các phương pháp kiểm thử con người

Hai phương pháp kiểm thử con người chủ yếu là Code Inspections và

Walkthroughs. Hai phương pháp này bao gồm một nhóm người đọc và kiểm tra

theo mã lệnh của chương trình. Mục tiêu của chúng là để tìm ra lỗi mà không gỡ lỗi.

Một Inspection hay Walkthrough là 1 sự cải tiến của phương pháp kiểm tra mà lập

trình viên đọc chương trình của họ trước khi kiểm thử nó. Inspections và

Walkthroughs hiệu quả hơn là bởi vì những người khác sẽ kiểm thử chương trình tốt

hơn chính tác giả của chương trình đó.

Inspections/Walkthroughs và kiểm thử bằng máy tính bổ sung cho nhau. Hiệu quả

tìm lỗi sẽ kém đi nếu thiếu đi 1 trong 2 phương pháp. Và đối với việc sửa đổi

Page 110: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 77 | 262

chương trình cũng nên sử dụng các phương pháp kiểm thử này cũng như các kỹ

thuật kiểm thử hồi quy.

Tổng duyệt – Walkthrough

Walkthrough là một thuật ngữ mô tả sự xem xét kỹ lưỡng của một quá trình ở mức

trừu tượng trong đó nhà thiết kế hay lập trình viên lãnh đạo các thành viên trong

nhóm và những người có quan tâm khác thông qua một sản phẩm phần mềm, và

những người tham gia đặt câu hỏi, và ghi chú những lỗi có thể có, sự vi phạm các

chuẩn phát triển và các vấn đề khác. Walkthrough mã lệnh là 1 tập các thủ tục và

các công nghệ dò lỗi cho việc đọc nhóm mã lệnh. Trong một Walkthrough, nhóm

các nhà phát triển – với 3 hoặc 4 thành viên là tốt nhất – thực hiện xét duyệt lại. Chỉ

1 trong các thành viên là tác giả của chương trình.

Một ưu điểm khác của walkthroughs, hiệu quả trong chi phí gỡ lỗi, là 1 thực tế mà

khi một lỗi được tìm thấy, nó thường được định vị chính xác trong mã lệnh. Thêm

vào đó, phương pháp này thường tìm ra 1 tập các lỗi, cho phép sau đó các lỗi đó

được sửa tất cả với nhau. Mặt khác, kiểm thử dựa trên máy tính,chỉ tìm ra triệu

chứng của lỗi (chương trình không kết thúc hoặc đưa ra kết quả vô nghĩa), và các

lỗi thường được tìm ra và sửa lần lượt từng lỗi một.

Thanh tra mã nguồn – Code Inspection

Thanh tra mã nguồn là 1 tập hợp các thủ tục và các kỹ thuật dò lỗi cho việc đọc các

nhóm mã lệnh. Một nhóm kiểm duyệt thường gồm 4 người. Một trong số đó đóng

vai trò là người điều tiết – một lập trình viên lão luyện và không được là tác giả của

chương trình và phải không quen với các chi tiết của chương trình. Người điều tiết

có nhiệm vụ: phân phối nguyên liệu và lập lịch cho các buổi kiểm duyệt, chỉ đạo

phiên làm việc, ghi lại tất cả các lỗi được tìm thấy và đảm bảo là các lỗi sau đó

được sửa. Thành viên thứ hai là một lập trình viên. Các thành viên còn lại trong

nhóm thường là nhà thiết kế của chương trình ( nếu nhà thiết kế khác lập trình viên)

và một chuyên viên kiểm thử.

Nguyên tắc kiểm thử phần mềm

Để kiểm thử đạt hiệu quả thì khi tiến hành kiểm thử phần mềm cần phải tuân thủ

một số quy tắc sau:

Quy tắc 1: Một phần quan trọng của 1 ca kiểm thử là định nghĩa của đầu ra hay kết

quả mong muốn.

Quy tắc 2: Lập trình viên nên tránh tự kiểm tra chương trình của mình.

Quy tắc 3: Nhóm lập trình không nên kiểm thử chương trình của chính họ.

Quy tắc 4: Kiểm tra thấu đáo mọi kết quả của mỗi kiểm tra.

Page 111: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 78 | 262

Quy tắc 5: Các ca kiểm thử phải được viết cho các trạng thái đầu vào không hợp lệ

và không mong muốn, cũng như cho các đầu vào hợp lệ và mong

muốn.

Quy tắc 6: Khảo sát 1 chương trình để xem liệu chương trình có thực hiện cái mà nó

cần thực hiện chỉ là 1 phần, phần còn lại là xem liệu chương trình có

thực hiện cái mà nó không cần phải thực hiện hay không.

Quy tắc 7: Tránh các ca kiểm thử bâng quơ trừ khi chương trình thực sự là 1

chương trình bâng quơ.

Quy tắc 8: Không dự kiến kết quả của kiểm thử theo giả thiết ngầm là không tìm

thấy lỗi.

Quy tắc 9: Xác suất tồn tại lỗi trong 1 đoạn chương trình là tương ứng với số lỗi đã

tìm thấy trong đoạn đó.

Quy tắc 10: Kiểm thử là 1 nhiệm vụ cực kỳ sáng tạo và có tính thử thách trí tuệ.

Page 112: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 79 | 262

THIẾT KẾ TEST – CASE

Khái niệm

Thiết kế test – case trong kiểm thử phần mềm là quá trình xây dựng các phương

pháp kiểm thử có thể phát hiện lỗi, sai sót, khuyết điểm của phần mềm để xây dựng

phần mềm đạt tiêu chuẩn.

Vai trò của thiết kế test – case

Tạo ra các ca kiểm thử tốt nhất có khả năng phát hiện ra lỗi, sai sót của

phần mềm một cách nhiều nhất.

Tạo ra các ca kiểm thử có chi phí rẻ nhất, đồng thời tốn ít thời gian và

công sức nhất.

Quy trình thiết kế test – case

Một trong những lý do quan trọng nhất trong kiểm thử chương trình là thiết kế và

tạo ra các ca kiểm thử - các Test case có hiệu quả. Với những ràng buộc về thời gian

và chi phí đã cho, thì vấn đề then chốt của kiểm thử trở thành:

Tập con nào của tất cả ca kiểm thử có thể có khả năng tìm ra nhiều lỗi nhất?

Thông thường, phương pháp kém hiệu quả nhất là kiểm tra tất cả đầu vào ngẫu

nhiên – quá trình kiểm thử một chương trình bằng việc chọn ngẫu nhiên một tập con

các giá trị đầu vào có thể. Về mặt khả năng tìm ra nhiều lỗi nhất, tập hợp các ca

kiểm thử được chọn ngẫu nhiên có rất ít cơ hội là tập hợp tối ưu hay gần tối ưu. Sau

đây là một số phương pháp để chọn ra một tập dữ liệu kiểm thử một cách thông

minh

Để kiểm thử hộp đen và kiểm thử hộp trắng một cách thấu đáo là không thể. Do đó,

một chiến lược kiểm thử hợp lý là chiến lược có thể kết hợp sức mạnh của cả hai

phương pháp trên: Phát triển 1 cuộc kiểm thử nghiêm ngặt vừa bằng việc sử dụng

các phương pháp thiết kế ca kiểm thử hướng hộp đen nào đó và sau đó bổ sung

thêm những ca kiểm thử này bằng việc khảo sát tính logic của chương trình, sử

dụng phương pháp hộp trắng.

Mỗi phương pháp có những ưu điểm cũng như khuyết điểm riêng, do đó để có được

tập các ca kiểm thử tối ưu, chúng ta cần kết hợp hầu hết các phương pháp. Quy trình

thiết kế các ca kiểm thử sẽ bắt đầu bằng việc phát triển các ca kiểm thử sử dụng

phương pháp hộp đen và sau đó phát triển bổ sung các ca kiểm thử cần thiết với

phương pháp hộp trắng.

Page 113: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 13 | 262

Kiểm thử hộp trắng - Kiểm thử bao phủ logic .

Kiểm thử hộp trắng có liên quan tới mức độ mà các ca kiểm thử thực hiện hay bao

phủ tính logic (mã nguồn) của chương trình. Kiểm thử hộp trắng cơ bản là việc thực

hiện mọi đường đi trong chương trình, nhưng việc kiểm thử đầy đủ đường đi là một

mục đích không thực tế cho một chương trình với các vòng lặp. Các tiêu chuẩn

trong kiểm thử bao phủ logic gồm có:

Bao phủ câu lệnh – Statement Coverage

Ý tưởng: Thực hiện mọi câu lệnh trong chương trình ít nhất 1 lần.

Xét ví dụ với đoạn mã lệnh JAVA sau:

public void foo (int a, int b, int x){

if (a>1 && b==0) {

x=x/a;}

if (a==2||x>1){

x=x+1;

}

}

Hình 2.1 Một hương trình nhỏ để kiểm thử

Page 114: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 14 | 262

Bạn có thể thực hiện mọi câu lệnh bằng việc viết 1 ca kiểm thử đơn đi qua đường

ace. Tức là, bằng việc đặt A=2, B=0 và X=3 tại điểm a, mỗi câu lệnh sẽ được thực

hiện 1 lần (thực tế, X có thể được gán bất kỳ giá trị nào).

Thường tiêu chuẩn này khá kém. Ví dụ, có lẽ nếu quyết định đầu tiên là phép or chứ

không phải phép and thì lỗi này sẽ không được phát hiện. Hay nếu quyết định thứ

hai mà bắt đầu với x>0, lỗi này cũng sẽ không được tìm ra. Cũng vậy, có 1 đường

đi qua chương trình mà ở đó x không thay đổi (đường đi abd). Nếu đây là 1 lỗi, thì

lỗi này có thể không tìm ra. Hay nói cách khác, tiêu chuẩn bao phủ câu lệnh quá yếu

đến nỗi mà nó thường là vô ích.

Bao phủ quyết định – Decision coverage

Ý tưởng: Viết đủ các ca kiểm thử mà mỗi quyết định có kết luận đúng hay sai ít

nhất 1 lần. Nói cách khác, mỗi hướng phân nhánh phải được xem xét kỹ lưỡng ít

nhất 1 lần.

Các ví dụ về câu lệnh rẽ nhánh hay quyết định là các câu lệnh switch, do-

while, và if-else. Các câu lệnh đa đường GOTO thường sử dụng trong một số ngôn

ngữ lập trình như FORTRAN.

Bao phủ quyết định thường thỏa mãn bao phủ câu lệnh. Vì mỗi câu lệnh là trên sự

bắt nguồn một đường đi phụ nào đó hoặc là từ 1 câu lệnh rẽ nhánh hoặc là từ điểm

vào của chương trình, mỗi câu lệnh phải được thực hiện nếu mỗi quyết định rẽ

nhánh được thực hiện. Tuy nhiên, có ít nhất 3 ngoại lệ:

Những chương trình không có quyết định.

Những chương trình hay thường trình con/phương thức với nhiều điểm

vào. Một câu lệnh đã cho có thể được thực hiện nếu và chỉ nếu chương

trình được nhập vào tại 1 điểm đầu vào riêng.

Các câu lệnh bên trong các ON-unit. Việc đi qua mỗi hướng rẽ nhánh

sẽ là không nhất thiết làm cho tất cả các ON-unit được thực thi.

Vì chúng ta đã thấy rằng bao phủ câu lệnh là điều kiện cần thiết, nên một chiến lược

tốt hơn là bao phủ quyết định nên được định nghĩa bao hàm cả bao phủ câu lệnh. Do

đó, bao phủ quyết định yêu cầu mỗi quyết định phải có kết luận đúng hoặc sai, và

mỗi câu lệnh đó phải được thực hiện ít nhất 1 lần.

Phương pháp này chỉ xem xét những quyết định hay những sự phân nhánh 2 đường

và phải được sửa đổi cho những chương trình có chứa những quyết định đa đường.

Ví dụ, các chương trình JAVA có chứa các lệnh select (case), các chương trình

FORTRAN chứa các lệnh số học (ba đường) if hoặc các lệnh tính toán hay số học

GOTO, và các chương trình COBOL chứa các lệnh GOTO biến đổi hay các lệnh

GO-TO-DEPENDING-ON (các lệnh goto phụ thuộc). Với những chương trình như

Page 115: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 15 | 262

vậy, tiêu chuẩn này đang sử dụng mỗi kết luận có thể của tất cả các quyết định ít

nhất 1 lần và gọi mỗi điểm vào tới chương trình hay thường trình con ít nhất 1 lần.

Trong hình 2.1, bao phủ quyết định có thể đạt được bởi ít nhất 2 ca kiểm thử bao

phủ các đường ace và abd hoặc acd và abe. Nếu chúng ta chọn khả năng thứ hai, thì

2 đầu vào test-case là A=3, B=0, X=3 và A=2, B=1, X=1.

Bao phủ quyết định là 1 tiêu chuẩn mạnh hơn bao phủ câu lệnh, nhưng vẫn khá yếu.

Ví dụ, chỉ có 50% cơ hội là chúng ta sẽ tìm ra con đường trong đó x không bị thay

đổi (ví dụ, chỉ khi bạn chọn khả năng thứ nhất). Nếu quyết định thứ hai bị lỗi (nếu

như đáng lẽ phải nói là x<1 thay vì x>1), lỗi này sẽ không được phát hiện bằng 2 ca

kiểm thử trong ví dụ trước.

Bao phủ điều kiện – Condition coverage

Ý tưởng: Viết đủ các ca kiểm thử để đảm bảo rằng mỗi điều kiện trong một quyết

định đảm nhận tất cả các kết quả có thể ít nhất một lần.

Vì vậy, như với bao phủ quyết định, thì bao phủ điều kiện không phải luôn

luôn dẫn tới việc thực thi mỗi câu lệnh. Thêm vào đó, trong tiêu chuẩn bao phủ điều

kiện, mỗi điểm vào chương trình hay thường trình con, cũng như các ON-unit, được

gọi ít nhất 1 lần. Ví dụ, câu lệnh rẽ nhánh do k=0 to 50 while (j+k<quest) có chứa 2

điều kiện là k<=50, và j+k<quest. Do đó, các ca kiểm thử sẽ được yêu cầu cho

những tình huống k<=50, k>50 (để đến lần lặp cuối cùng của vòng lặp), j+k<quest,

và j+k>=quest.

Hình 2.1 có 4 điều kiện: A>1, B=0, A=2, X>1. Do đó các ca kiểm thử đầy đủ là cần

thiết để thúc đẩy những trạng thái mà A>1, A<=1, B=0 và B<>0 có mặt tại điểm a

và A=2, A<>2, X>1, X<=1 có mặt tại điểm b. Số lượng đầy đủ các ca kiểm thử

thỏa mãn tiêu chuẩn và những đường đi mà được đi qua bởi mỗi ca kiểm thử là:

1. A=2, B=0, X=4 ace

2. A=1, B=1, X=1 abd

Chú ý là, mặc dù cùng số lượng các ca kiểm thử được tạo ra cho ví dụ này, nhưng

bao phủ điều kiện thường tốt hơn bao phủ quyết định là vì nó có thể (nhưng không

luôn luôn) gây ra mọi điều kiện riêng trong 1 quyết định để thực hiện với cả hai kết

quả, trong khi bao phủ quyết định lại không. Ví dụ trong cùng câu lệnh rẽ nhánh:

DO K=0 TO 50 WHILE (J+K<QUEST) là 1 nhánh 2 đường (thực hiện thân vòng

lặp hay bỏ qua nó). Nếu bạn đang sử dụng kiểm thử quyết định, thì tiêu chuẩn này

có thể được thỏa mãn bằng cách cho vòng lặp chạy từ K=0 tới 51, mà chưa từng

kiểm tra trường hợp trong đó mệnh đề WHILE bị sai. Tuy nhiên, với tiêu chuẩn bao

phủ điều kiện, 1 ca kiểm thử sẽ cần phải cho ra 1 kết quả sai cho những điều kiện

J+K<QUEST.

Mặc dù nếu mới nhìn thoáng qua, tiêu chuẩn bao phủ điều kiện xem ra thỏa mãn

tiêu chuẩn bao phủ quyết định, nhưng không phải lúc nào cũng vậy. Nếu quyết định

Page 116: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 16 | 262

IF (A&B) được kiểm tra, thì tiêu chuẩn bao phủ điều kiện sẽ cho phép bạn viết 2 ca

kiểm thử - A đúng, B sai, và A sai, B đúng – nhưng điều này sẽ không làm cho

mệnh đề THEN của câu lệnh IF được thực hiện.

Ví dụ, 2 ca kiểm thử khác:

1. A=1, B=0, X=3

2. A=2, B=1, X=1

bao phủ tất cả các kết quả điều kiện, nhưng chúng chỉ bao phủ 2 trong 4 kết quả

quyết định (cả 2 đều bao phủ đường đi abd và do đó, không sử dụng kết quả true

của quyết định đầu tiên và kết quả false của quyết định thứ hai).

Bao phủ quyết định/điều kiện – Decision/condition coverage

Tư tưởng: Thực hiện đủ các ca kiểm thử mà mỗi điều kiện trong 1 quyết định thực

hiện trên tất cả các kết quả có thể ít nhất 1 lần, và mỗi điểm vào được gọi ít nhất 1

lần.

Điểm yếu của bao phủ quyết định/điều kiện là mặc dù xem ra nó có thể sử dụng tất

cả các kết quả của tất cả các điều kiện, nhưng thường không phải vậy vì những điều

kiện chắc chắn đã cản các điều kiện khác.

Hình 2.2 ã máy ho hương trình trong Hình 2.1

Biểu đồ tiến trình trong hình 2.2 là cách 1 trình biên dich tạo ra mã máy cho chương

trình trong Hình 2.1. Các quyết định đa điều kiện trong chương trình nguồn đã bị

chia thành các quyết định và các nhánh riêng vì hầu hết các máy không được chế

tạo để có thể thực hiện các quyết định đa điều kiện. Khi đó 1 bao phủ kiểm thử tỉ mỉ

Page 117: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 17 | 262

hơn xuất hiện là việc sử dụng tất cả các kết quả có thể của mỗi quyết định gốc. Hai

ca kiểm thử bao phủ quyết định trước không làm được điều này; chúng không thể

sử dụng kết quả false của quyết định H và kết quả true của quyết định K.

Lí do, như đã được chỉ ra trong hình 2.2, là những kết quả của các điều kiện trong

các biểu thức and và or có thể cản trở hay ngăn chặn việc ước lượng các quyết định

khác. Ví dụ, nếu 1 điều kiện and là sai, không cần kiểm tra các điều kiện tiếp theo

trong biểu thức. Tương tự như vậy, nếu 1 điều kiện or là đúng thì cũng không cần

kiểm tra các điều kiện còn lại. Do đó, các lỗi trong biểu thức logic không phải lúc

nào cũng được phát hiện bằng các tiêu chuẩn bao phủ điều kiện và bao phủ quyết

định/điều kiện.

Bao phủ đa điều kiện – Multiple condition coverage

Ý tưởng: Viết đủ các ca kiểm thử mà tất cả những sự kết hợp của các kết quả điều

kiện có thể trong mỗi quyết định, và tất cả các điểm vào phải được gọi ít nhất 1 lần.

Ví dụ, xét chuỗi mã lệnh sau:

NOTFOUND = TRUE;

DO I=1 TO TABSIZE WHILE (NOTFOUND); /*SEARCH TABLE*/

…searching logic…;

END;

Bốn tình huống để kiểm thử là:

1. I<= TABSIZE và NOTFOUND có giá trị đúng (đang duyệt)

2. I<= TABSIZE và NOTFOUND có giá trị sai (tìm thấy mục vào trước

khi gặp cuối bảng).

3. I>TABSIZE và NOTFOUND có giá trị đúng (gặp cuối bảng mà không

tìm thấy mục vào).

4. I>TABSIZE và NOTFOUND có giá trị sai (mục vào là cái cuối cùng

trong bảng).

Dễ nhận thấy là tập hợp các ca kiểm thử thỏa mãn tiêu chuẩn đa điều kiện cũng thỏa

mãn các tiêu chuẩn bao phủ quyết định, bao phủ điều kiện và bao phủ quyết

định/điều kiện.

Quay lại hình 2.1, các ca kiểm thử phải bao phủ 8 sự kết hợp:

1. A>1, B= 0

2. A>1, B<>0

Page 118: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 18 | 262

3. A<=1, B=0

4. A<=1, B<>0

5. A=2, X>1

6. A=2, X<=1

7. A<>2, X>1

8. A<>2, X<=1

Vì là ca kiểm thử sớm hơn, nên cần chú ý là các trường hợp từ 5 đến 8 biểu diễn các

giá trị tại vị trí câu lệnh IF thứ hai. Vì X có thể thay đổi ở trên câu lệnh IF này, nên

giá trị cần tại câu lệnh IF này phải được sao dự phòng thông qua tính logic để tìm ra

các giá trị đầu vào tương ứng.

Những sự kết hợp để được kiểm tra này không nhất thiết ngụ ý rằng cần thực hiện

cả 8 ca kiểm thử. Trên thực tế, chúng có thể được bao phủ bởi 4 ca kiểm thử. Các

giá trị đầu vào kiểm thử, và sự kết hợp mà chúng bao phủ, là như sau:

A=2, B=0, X=4 Bao phủ trường hợp 1, 5

A=2, B=1, X=1 Bao phủ trường hợp 2, 6

A=1, B=0, X=2 Bao phủ trường hợp 3, 7

A=1, B=1, X=1 Bao phủ trường hợp 4, 8

Thực tế là việc có 4 ca kiểm thử và 4 đường đi riêng biệt trong hình 2.1 chỉ là sự

trùng hợp ngẫu nhiên. Trên thực tế, 4 ca kiểm thử này không bao phủ mọi đường đi,

chúng bỏ qua đường đi acd. Ví dụ, bạn sẽ cần 8 ca kiểm thử cho quyết định sau mặc

dù nó chỉ chứa 2 đường đi:

If (x==y&&length(z)==0&&FLAG) {

J=1;}

Else {

I=1;}

Trong trường hợp các vòng lặp, số lượng các ca kiểm thử được yêu cầu bởi tiêu

chuẩn đa điều kiện thường ít hơn nhiều số lượng đường đi.

Tóm lại, đối với những chương trình chỉ chứa 1 điều kiện trên 1 quyết định, thì 1

tiêu chuẩn kiểm thử nhỏ nhất là một số lượng đủ các ca kiểm thử để (1) gọi tất cả

các kết quả của mỗi quyết định ít nhất 1 lần và (2) gọi mỗi điểm của mục vào (như

là điểm vào hay ON-unit) ít nhất 1 lần, để đảm bảo là tất cả các câu lệnh được thực

hiện ít nhất 1 lần. Đối với những chương trình chứa các quyết định có đa điều kiện

thì tiêu chuẩn tối thiểu là số lượng đủ các ca kiểm thử để gọi tất cả những sự kết

Page 119: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 19 | 262

hợp có thể của các kết quả điều kiện trong mỗi quyết định, và tất cả các điểm vào

của chương trình ít nhất 1 lần.

Kiểm thử hộp đen

Phân lớp tương đương – Equivalence Patitioning

Phân lớp tương đương là một phương pháp kiểm thử hộp đen chia miền đầu vào của

một chương trình thành các lớp dữ liệu, từ đó suy dẫn ra các ca kiểm thử. Phương

pháp này cố gắng xác định ra một ca kiểm thử mà làm lộ ra một lớp lỗi, do đó làm

giảm tổng số các trường hợp kiểm thử phải được xây dựng.

Thiết kế ca kiểm thử cho phân lớp tương đương dựa trên sự đánh giá về các lớp

tương đương với một điều kiện vào. Lớp tương đương biểu thị cho tập các trạng

thái hợp lệ hay không hợp lệ đối với điều kiện vào.

Một cách xác định tập con này là để nhận ra rằng 1 ca kiểm thử được lựa chọn tốt

cũng nên có 2 đặc tính khác:

1. Giảm thiểu số lượng các ca kiểm thử khác mà phải được phát triển để hoàn

thành mục tiêu đã định của kiểm thử “hợp lý”.

2. Bao phủ một tập rất lớn các ca kiểm thử có thể khác. Tức là, nó nói cho

chúng ta một thứ gì đó về sự có mặt hay vắng mặt của những lỗi qua tập

giá trị đầu vào cụ thể.

Thiết kế Test-case bằng phân lớp tương đương tiến hành theo 2 bước:

(1). Xác định các lớp tương đương và

(2). Xác định các ca kiểm thử.

Xác định các lớp tương đương:

Các lớp tương đương được xác định bằng bằng cách lấy mỗi trạng thái đầu vào

(thường là 1 câu hay 1 cụm từ trong đặc tả) và phân chia nó thành 2 hay nhiều nhóm

(có thể sử dụng bảng 2.3 để liệt kê các lớp tương đương).

Hình 2.3 Một mẫu cho việc liệt kê các lớp tương đương

Điều kiện bên ngoài Các lớp tương đương hợp lệ Các lớp tương đương không

hợp lệ

Chú ý là hai kiểu lớp tương đương được xác định: lớp tương đương hợp lệ mô tả

các đầu vào hợp lệ của chương trình, và lớp tương đương không hợp lệ mô tả tất cả

các trạng thái có thể khác của điều kiện (ví dụ, các giá trị đầu vào không đúng). Với

1 đầu vào hay điều kiện bên ngoài đã cho, việc xác định các lớp tương đương hầu

Page 120: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 20 | 262

như là 1 quy trình mang tính kinh nghiệm. Để xác định các lớp tương đương c có

thể áp dụng tập các nguyên tắc dưới đây:

1. Nếu 1 trạng thái đầu vào định rõ giới hạn của các giá trị, xác định 1 lớp

tương đương hợp lệ và 2 lớp tương đương không hợp lệ.

2. Nếu 1 trạng thái đầu vào xác định số giá trị, xác định 1 lớp tương đương

hợp lệ và 2 lớp tương đương bất hợp lệ.

3. Nếu 1 trạng thái đầu vào chỉ định tập các giá trị đầu vào và chương trình sử

dụng mỗi giá trị là khác nhau, xác định 1 lớp tương đương hợp lệ cho mỗi

loại và 1 lớp tương đương không hợp lệ.

4. Nếu 1 trạng thái đầu vào chỉ định một tình huống “chắc chắn – must be”,

xác định 1 lớp tương đương hợp lệ và 1 lớp tương đương không hợp lệ.

Nếu có bất kỳ lý do nào để tin rằng chương trình không xử lý các phần tử trong

cùng 1 lớp là như nhau, thì hãy chia lớp tương đương đó thành các lớp tương đương

nhỏ hơn.

Xác định các ca kiểm thử :

Với các lớp tương đương xác định được ở bước trên, bước thứ hai là sử dụng các

lớp tương đương đó để xác định các ca kiểm thử. Quá trình này như sau:

1. Gán 1 số duy nhất cho mỗi lớp tương đương.

2. Cho đến khi tất cả các lớp tương đương hợp lệ được bao phủ bởi (hợp nhất

thành) các ca kiểm thử, viết 1 ca kiểm thử mới bao phủ càng nhiều các lớp

tương đương đó chưa được bao phủ càng tốt.

3. Cho đến khi các ca kiểm thử của bạn đã bao phủ tất cả các lớp tương

đương không hợp lệ, viết 1 ca kiểm thử mà bao phủ một và chỉ một trong

các lớp tương đương không hợp lệ chưa được bao phủ.

4. Lý do mà mỗi ca kiểm thử riêng bao phủ các trường hợp không hợp lệ là vì

các kiểm tra đầu vào không đúng nào đó che giấu hoặc thay thế các kiểm

tra đầu vào không đúng khác.

Mặc dù việc phân lớp tương đương là rất tốt khi lựa chọn ngẫu nhiên các ca kiểm

thử, nhưng nó vẫn có những thiếu sót. Ví dụ, nó bỏ qua các kiểu test – case có lợi

nào đó. Hai phương pháp tiếp theo, phân tích giá trị biên và đồ thị nguyên nhân –

kết quả , bao phủ được nhiều những thiếu sót này.

Page 121: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 21 | 262

Phân tích giá trị biên – Boundary Value Analysis

Kinh nghiệm cho thấy các ca kiểm thử mà khảo sát tỷ mỷ các điều kiện biên có tỷ lệ

phần trăm cao hơn các ca kiểm thử khác. Các điều kiện biên là những điều kiện mà

các tình huống ngay tại, trên và dưới các cạnh của các lớp tương đương đầu vào và

các lớp tương đương đầu ra. Phân tích các giá trị biên là phương pháp thiết kế ca

kiểm thử bổ sung thêm cho phân lớp tương đương, nhưng khác với phân lớp tương

đương ở 2 khía cạnh:

1. Phân tích giá trị biên không lựa chọn phần tử bất kỳ nào trong 1 lớp tương

đương là điển hình, mà nó yêu cầu là 1 hay nhiều phần tử được lựa chọn

như vậy mà mỗi cạnh của lớp tương đương đó chính là đối tượng kiểm tra.

2. Ngoài việc chỉ tập trung chú ý vào các trạng thái đầu vào (không gian đầu

vào), các ca kiểm thử cũng nhận được bằng việc xem xét không gian kết

quả (các lớp tương đương đầu ra).

Phân tích giá trị biên yêu cầu óc sáng tạo và lượng chuyên môn hóa nhất định và nó

là một quá trình mang tính kinh nghiệm rất cao. Tuy nhiên, có một số quy tắc chung

như sau:

1. Nếu 1 trạng thái đầu vào định rõ giới hạn của các giá trị, hãy viết các ca

kiểm thử cho các giá trị cuối của giới hạn, và các ca kiểm thử đầu vào

không hợp lệ cho các trường hợp vừa ra ngoài phạm vi.

2. Nếu 1 trạng thái đầu vào định rõ số lượng giá trị, hãy viết các ca kiểm thử

cho con số lớn nhất và nhỏ nhất của các giá trị và một giá trị trên, một giá

trị dưới những giá trị này.

3. Sử dụng quy tắc 1 cho mỗi trạng thái đầu vào. Ví dụ, nếu 1 chương trình

tính toán sự khấu trừ FICA hàng tháng và nếu mức tối thiểu là 0.00$, và tối

đa là 1,165.25$, hãy viết các ca kiểm thử mà khấu trừ 0.00$ và 1,165.25,

khấu trừ âm và khấu trừ lớn hơn 1,165.25$. Chú ý là việc xem xét giới hạn

của không gian kết quả là quan trọng vì không phải lúc nào các biên của

miền đầu vào cũng mô tả cùng một tập sự kiện như biên của giới hạn đầu

ra (ví dụ, xét chương trình con tính SIN). Ngoài ra, không phải lúc nào

cũng có thể tạo ra 1 kết quả bên ngoài giới hạn đầu ra, nhưng tuy nhiên rất

đáng để xem xét tiềm ẩn đó.

4. Sử dụng nguyên tắc 2 cho mỗi trạng thái đầu ra.

Page 122: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 22 | 262

5. Nếu đầu vào hay đầu ra của 1 chương trình là tập được sắp thứ tự ( ví dụ,1

file tuần tự hay 1 danh sách định tuyến hay 1 bảng) tập trung chú ý vào các

phần tử đầu tiên và cuối cùng của tập hợp.

6. Sử dụng sự khéo léo của bạn để tìm các điều kiện biên.

Đồ thị nguyên nhân – kết quả - Cause & Effect Graphing

Một yếu điểm của phân tích giá trị biên và phân lớp tương đương là chúng không

khảo sát sự kết hợp của các trường hợp đầu vào. Việc kiểm tra sự kết hợp đầu vào

không phải là một nhiệm vụ đơn giản bởi vì nếu bạn phân lớp tương đương các

trạng thái đầu vào, thì số lượng sự kết hợp thường là rất lớn. Nếu bạn không có cách

lựa chọn có hệ thống một tập con các trạng thái đầu vào, có lẽ bạn sẽ chọn ra một

tập tùy hứng các điều kiện, điều này có thể dẫn tới việc kiểm thử không có hiệu quả.

Đồ thị nguyên nhân – kết quả hỗ trợ trong việc lựa chọn một cách có hệ thống tập

các ca kiểm thử có hiệu quả cao. Nó có tác động có lợi ảnh hưởng tới việc chỉ ra

tình trạng chưa đầy đủ và nhập nhằng trong đặc tả. Nó cung cấp cả cách biểu diễn

chính xác cho các điều kiện logic và hành động tương ứng

Quá trình dưới đây được sử dụng để xây dựng được các test – case:

1. Đặc tả được chia thành các phần có thể thực hiện được. Điều này là cần

thiết bởi vì đồ thị nguyên nhân – kết quả trở nên khó sử dụng khi được sử

dụng trên những đặc tả lớn.

2. Nguyên nhân và kết quả trong các đặc tả được nhận biết. Một nguyên nhân

là một trạng thái đầu vào nhất định hay một lớp tương đương của các trạng

thái đầu vào. Một kết quả là một trạng thái đầu ra hay 1 sự biến đổi hệ

thống (kết quả còn lại mà 1 đầu vào có trạng thái của 1 chương trình hay

hệ thống). Bạn nhận biết nguyên nhân và kết quả bằng việc đọc từng từ của

đặc tả và gạch chân các từ hoặc cụm từ mô tả nguyên nhân và kết quả. Khi

được nhận biết, mỗi nguyên nhân và kết quả được gán cho 1 số duy nhất.

3. Xây dựng đồ thị nguyên nhân – kết quả bằng cách phát triển và biến đổi

nội dung ngữ nghĩa của đặc tả thành đồ thị Boolean nối giữa nguyên nhân

và kết quả.

4. Đồ thị được được diễn giải với các ràng buộc mô tả những sự kết hợp của

nguyên nhân và/hoặc kết quả là không thể vì các ràng buộc ngữ nghĩa và

môi trường.

Page 123: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 23 | 262

5. Bằng việc dò theo các điều kiện trạng thái trong đồ thị một cách cẩn thận,

bạn chuyển đổi đồ thị thành một bảng quyết định mục vào giới hạn. Mỗi

cột trong bảng mô tả một ca kiểm thử.

6. Các cột trong bảng quyết định được chuyển thành các ca kiểm thử.

Ký hiệu cơ bản cho đồ thị được chỉ ra trong hình 2.4. Tưởng tượng mỗi nút có giá

trị là 0 hoặc 1; 0 mô tả trạng thái vắng mặt và 1 mô tả trạng thái có mặt. Hàm đồng

nhất nói là nếu a là 1 thì b là 1; ngược lại, b là 0. Hàm not là nói nếu a là 1 thì b là

0; ngược lại thì b là 1. Hàm or khẳng định rằng nếu a hoặc b hoặc c là 1, thì d là 1;

ngược lại d là 0. Hàm and khẳng định nếu cả a và b là 1 thì c là 1; ngược lại c là 0.

Hai hàm or và and được phép có số lượng đầu vào bất kỳ.

Hình 2.4 Các ký hiệu đồ thị nguyên nhân – kết quả cơ bản

Trong hầu hết các chương trình, sự kết hợp nào đó của một số nguyên nhân là

không thể bởi vì lý do ngữ nghĩa và môi trường (ví dụ, một ký tự không thể đồng

thời vừa là “A” vừa là “B”). khi đó, ta sử dụng ký hiệu trong Hình 2.5. Ràng buộc E

(Exclude – loại trừ) khẳng định rằng tối đa, chỉ có hoặc a hoặc b có thể là 1 (a và b

không thể đồng thời là 1). Ràng buộc I (Include – bao hàm) khẳng định ít nhất một

trong a, b hoặc c phải luôn luôn là 1 (a, b hoặc c không thể đồng thời là 0). Ràng

buộc O (Only – chỉ một) khẳng định một và chỉ một hoặc a hoặc b phải là 1. Ràng

buộc R (Request – yêu cầu) khẳng định rằng khi a là 1, thì b phải là 1 (ví dụ, không

Page 124: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 24 | 262

thể có trường hợp a là 1, còn b là 0). Ràng buộc M (Mask – mặt nạ) khẳng định là

nếu kết quả a là 1, kết quả b sẽ bắt buộc phải là 0.

Hình 2.5 Các ký hiệu ràng buộc

Bước tiếp theo là tạo bảng quyết định mục vào giới hạn – limited-entry decision

table. Tương tự với các bảng quyết định, thì nguyên nhân chính là các điều kiện và

kết quả chính là các hành động. Quy trình được sử dụng là như sau:

1. Chọn một kết quả để là trạng thái có mặt (1).

2. Lần ngược trở lại đồ thị, tìm tất cả những sự kết hợp của các nguyên nhân

(đối tượng cho các rằng buộc) mà sẽ thiết lập kết quả này thành 1.

3. Tạo một cột trong bảng quyết định cho mỗi sự kết hợp nguyên nhân.

4. Với mỗi sự kết hợp, hãy quy định trạng thái của tất cả các kết quả khác và

đặt chúng vào mỗi cột.

Trong khi biểu diễn bước 2, cần quan tâm các vấn đề sau:

1. Khi lần ngược trở lại qua một nút or mà đầu ra của nó là 1, không bao giờ

thiết lập nhiều hơn 1 đầu vào cho nút or là 1 một cách đồng thời. Điều này

được gọi là path sensitizing – làm nhạy đường đi. Mục tiêu của nó là để

ngăn chặn dò lỗi thất bại vì một nguyên nhân che đi một nguyên nhân

khác.

Page 125: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 25 | 262

2. Khi lần ngược trở lại qua một nút and mà đầu ra của nó là 0, dĩ nhiên, phải

liệt kê tất cả các sự kết hợp đầu vào dẫn tới đầu ra 0. Tuy nhiên, nếu bạn

đang khảo sát trạng thái mà 1 đầu ra là 0 và một hay nhiều đầu ra khác là 1,

thì không nhất thiết phải liệt kê tất cả các điều kiện mà dưới điều kiện đó

các đầu vào khác có thể là 1.

3. Khi lần ngược trở lại qua một nút and mà đầu ra của nó là là 0, chỉ cần liệt

kê 1 điều kiện trong đó tất cả đầu vào bằng 0. (Nếu nút and ở chính giữa

của đồ thị như vậy thì tất cả các đầu vào của nó xuất phát từ các nút trung

gian khác, có thể có quá nhiều trạng thái mà trong trạng thái đó tất cả các

đầu vào của nó bằng 0.)

Hình 2.6 Những xem xét được sử dụng khi dò theo đồ thị

Nếu x=1, không quan tâm về

trường hợp a=b=1 (sự xem xét

thứ 1)

Nếu x=0, liệt kê tất cả các trường

hợp trong đó a=b=0.

Nếu x =1, liệt kê tất cả các trường

hợp trong đó a=b=c=1.

Nếu x=0, bao gồm chỉ 1 trường

hợp mà a=b=c=0 (sự xem xét 3).

Đối với các trạng thái mà abc là

001, 010, 100, 011, 101 và 110 ,

bao gồm chỉ 1 trường hợp mỗi

trạng thái (sự xem xét 2).

Những sự xem xét này có thể xuất hiện thất thường, nhưng chúng có một mục đích

rất quan trọng: để giảm bớt các kết quả được kết hợp của đồ thị. Chúng liệt kê các

trường hợp mà hướng về các ca kiểm thử ít có lợi. Nếu các ca kiểm thử ít có lợi

không được liệt kê, một đồ thị nguyên nhân – kết quả lớn sẽ tạo ra một số lượng ca

kiểm thử cực kỳ lớn. Nếu số lượng các ca kiểm thử trên thực tế là quá lớn, bạn sẽ

chọn ra 1 tập con nào đó, nhưng không đảm bảo là các ca kiểm thử ít có lợi sẽ là

những ca kiểm thử được liệt kê. Do đó, tốt hơn hết là liệt kê chúng trong suốt quá

trình phân tích của đồ thị.

Page 126: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 26 | 262

NHẬN XÉT:

Vẽ đồ thị nguyên nhân – kết quả là phương pháp tạo các ca kiểm thử có hệ thống

mô tả sự kết hợp của các điều kiện. Sự thay đổi sẽ là 1 sự lựa chọn kết hợp không

thể dự tính trước, nhưng khi thực hiện như vậy, có vẻ như bạn sẽ bỏ sót nhiều ca

kiểm thử “thú vị” được xác định bằng đồ thị nguyên nhân – kết quả .

Vì vẽ đồ thị nguyên nhân – kết quả yêu cầu chuyển một đặc tả thành một mạng

logic Boolean, nó cung cấp một triển vọng khác và sự hiểu biết sâu sắc hơn nữa về

đặc tả. Trên thực tế, sự phát triển của 1 đồ thị nguyên nhân – kết quả là cách hay để

khám phá sự mơ hồ và chưa đầy đủ trong các đặc tả.

Mặc dù việc vẽ đồ thị nguyên nhân – kết quả tạo ra tập các ca kiểm thử hữu dụng,

nhưng thông thường nó không tạo ra tất cả các ca kiểm thử hữu dụng mà có thể

được nhận biết. Ngoài ra, đồ thị nguyên nhân – kết quả không khảo sát thỏa đáng

các điều kiện giới hạn. Dĩ nhiên, bạn có thể cố gắng bao phủ các điều kiện giới hạn

trong suốt quá trình.

Tuy nhiên, vấn đề trong việc thực hiện điều này là nó làm cho đồ thị rất phức tạp và

dẫn tới số lượng rất lớn các ca kiểm thử. Vì thế, tốt nhất là xét 1 sự phân tích giá trị

giới hạn tách rời nhau.

Vì đồ thị nguyên nhân – kết quả làm chúng ta mất thời gian trong việc chọn các giá

trị cụ thể cho các toán hạng, nên các điều kiện giới hạn có thể bị pha trộn thành các

ca kiểm thử xuất phát từ đồ thị nguyên nhân – kết quả. Vì vậy, chúng ta đạt được

một tập các ca kiểm thử nhỏ nhưng hiệu quả mà thỏa mãn cả 2 mục tiêu.

Chú ý là việc vẽ đồ thị nguyên nhân – kết quả phù hợp với một số quy tắc trong

Chương 1. Việc xác định đầu ra mong đợi cho mỗi ca kiểm thử là một phần cố hữu

của kỹ thuật (mỗi cột trong bảng quyết định biểu thị các kết quả được mong đợi).

Cũng chú ý là nó khuyến khích chúng ta tìm kiếm các kết quả có tác dụng không

mong muốn.

Khía cạnh khó nhất của kỹ thuật này là quá trình chuyển đổi đồ thị thành bảng quyết

định. Quá trình này có tính thuật toán, tức là bạn có thể tự động hóa nó bằng việc

viết 1 chương trình. Trên thị trường đã có một vài chương trình thương mại tồn tại

giúp cho quá trình chuyển đổi này.

Đoán lỗi – Error Guessing

Một kỹ thuật thiết kế test-case khác là error guessing – đoán lỗi. Tester được đưa

cho 1 chương trình đặc biệt, họ phỏng đoán, cả bằng trực giác và kinh nghiệm, các

loại lỗi có thể và sau đó viết các ca kiểm thử để đưa ra các lỗi đó.

Thật khó để đưa ra một quy trình cho kỹ thuật đoán lỗi vì nó là một quy trình có

tính trực giác cao và không thể dự đoán trước. Ý tưởng cơ bản là liệt kê một danh

sách các lỗi có thể hay các trường hợp dễ xảy ra lỗi và sau đó viết các ca kiểm thử

dựa trên danh sách đó. Một ý tưởng khác để xác định các ca kiểm thử có liên đới

Page 127: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 27 | 262

với các giả định mà lập trình viên có thể đã thực hiện khi đọc đặc tả (tức là, những

thứ bị bỏ sót khỏi đặc tả, hoặc là do tình cờ, hoặc là vì người viết có cảm giác

những đặc tả đó là rõ ràng). Nói cách khác, bạn liệt kê những trường hợp đặc biệt

đó mà có thể đã bị bỏ sót khi chương trình được thiết kế.

Chiến lược

Các phương pháp thiết kế test-case đã được thảo luận có thể được kết hợp thành

một chiến lược toàn diện. Vì mỗi phương pháp có thể đóng góp 1 tập riêng các ca

kiểm thử hữu dụng, nhưng không cái nào trong số chúng tự nó đóng góp một tập

trọn vẹn các các ca kiểm thử. Chiến lược hợp lý như sau:

1. Nếu đặc tả có chứa sự kết hợp của các điều kiện đầu vào, hãy bắt đầu với

việc vẽ đồ thị nguyên nhân – kết quả.

2. Trong trường hợp bất kỳ, sử dụng phương pháp phân tích giá trị biên. Hãy

nhớ rằng đây là một sự phân tích của các biên đầu vào và đầu ra. Phương

pháp phân tích giá trị biên mang lại một tập các điều kiện kiểm tra bổ sung,

và rất nhiều hay toàn bộ các điều kiện này có thể được hợp nhất thành các

kiểm thử nguyên nhân – kết quả.

3. Xác định các lớp tương đương hợp lệ và không hợp lệ cho đầu vào và đầu

ra, và bổ sung các ca kiểm thử được xác định trên nếu cần thiết.

4. Sử dụng kỹ thuật đoán lỗi để thêm các ca kiểm thử thêm vào.

5. Khảo sát tính logic của chương trình liên quan đến tập các ca kiểm thử. Sử

dụng tiêu chuẩn bao phủ quyết định, bao phủ điều kiện, bao phủ quyết

định/điều kiện, hay bao phủ đa điều kiện ( trong đó bao phủ đa điều kiện là

được sử dụng nhiều nhất ). Nếu tiêu chuẩn bao phủ không đạt được bởi các

ca kiểm thử được xác định trong bốn bước trước, và nếu việc đạt được tiêu

chuẩn là không thể ( tức là, những sự kết hợp chắc chắn của các điều kiện

có thể là không thể tạo vì bản chất của chương trình), hãy thêm vào các ca

kiểm thử có khả năng làm cho thỏa mãn tiêu chuẩn.

Tuy việc sử dụng chiến lược này sẽ không đảm bảo rằng tất cả các lỗi sẽ được tìm

thấy, nhưng nó đã được xác minh là đại diện cho một sự thỏa thuận hợp lý.

Page 128: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 28 | 262

KẾT LUẬN

Kiểm thử phần mềm, một hướng đi không còn mới mẻ trên thế giới, nhưng lại là

một hướng đi rất mới ở Việt Nam. Nó hứa hẹn một tương lai mới cho các học sinh,

sinh viên ngành CNTT.

Qua tìm hiểu và xây dựng đề tài này, em thấy mình đã đạt được một ưu điểm cũng

như vẫn còn một số tồn tại.

Những điểm đạt được:

Nắm được tổng quan về kiểm thử phần mềm: Các khái niệm cơ bản,

các phương pháp kiểm thử phần mềm, và các vấn đề liên quan …

Tìm hiểu và nắm được các phương pháp và chiến lược thiết kế test –

case trong kiểm thử phần mềm.

Bổ sung và rèn luyện thêm kỹ năng sử dụng phần mềm Word và

Powerpoint.

Nâng cao khả năng đọc hiểu tài liệu Tiếng Anh.

Những điểm chưa đạt:

Sự áp dụng những kiến thức tìm hiểu được mới chỉ dừng lại ở một bài

toán nhỏ, mà vẫn chưa thử áp dụng cho các bài toán hay ứng dụng lớn.

Từ những điểm đạt và chưa đạt ở trên, chúng em hi vọng sẽ nhận được sự góp ý

chân thành của các thầy và các bạn để bài báo cáo được hoàn thiện hơn.

Page 129: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 29 | 262

TÀI LIỆU THAM KHẢO 1. The Art of Software Testing, Glenford J. Myers, Second Edition, John Wiley and

Sons, Inc.

2. Software Engineering - A Practitioner’s Approach, Roger S.Pressman, Sixth

Edition, Ph.D, McGraw-Hill, Inc.

3. A Practitioner's Guide to Software Test Design, Lee Copeland, First Edition,

Artech House Publishers Boston, London.

4. Effective methods for Software Testing, William E. Perry, 3rd Edition, Wiley

Publishing, Indian.

5. Software Testing, Ron Patton, Second Edition, Sam Publishing.

6. http://en.wikipedia.org/wiki/Software_testing

Một số trang web về kiểm thử phần mềm khác.

Page 130: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 30 | 262

Nhóm 08:

Cao Hữu Thành Huy – DTH114097

Lý Thế Vinh – DTH114146

Lê Ngọc Chí – DTH092128

Phan Hải Phú – DTH114117

Page 131: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 31 | 262

I. Giới thiệu về chủ đề

1. Khảo sát hiện trạng:

Trong công việc quản lý thì việc báo cáo thống kê số liệu hay dữ liệu luôn là điều cần

thiết và rất quan trọng. Nó giúp cho người quản lý nắm rõ được tình hình của công

việc, của sản phẩm hay các vấn đề liên quan cần quản lý, tránh các trường hợp dư thừa

hay thất thoát … nhưng việc thống kê báo cáo bằng thủ công rất tốn thời gian và chi

phí, số liệu không được chuẩn xác hoặc phải kiểm định nhiều lần.

Do đó trong các chương trình hay phần mềm quản lý hiện nay luôn đòi hỏi phải có các

chức năng thống kê, báo cáo và in ấn giúp người dùng quản lý dể dàng và tiện lợi hơn,

số liệu thống kê hoặc in ấn sẽ được tự động so sánh nhiều lần ở nhiều mức độ tránh

các trường hợp sai xót …

Các dữ liệu được lưu trữ an toàn và chuẩn xác cho việc thống kê bao gồm cả ngày giờ

và các dữ liệu cần thiết cho việc báo cáo.

2. Các thành phần:

Nhận dữ liệu -> Nhập dữ liệu -> Lưu dữ liệu vào CSDL -> Yêu cầu thống kê báo cáo

-> Tự động so sánh và kiểm tra dữ liệu -> Hiển thị dữ liệu theo yêu cầu -> Lưu trữ, in

ấn.

Lớp Presentation Layer (PL): Chứa các giao diện, các form nhập liệu và các thao tác

với chương trình như nhập dữ liệu, xem thống kê-báo cáo, thiết kế biểu mẫu, lưu trữ

và in ấn dữ liệu…

Lớp Business Logic Layer (BLL): Xử lý các nghiệp vụ của chương trình như so sánh

và kiểm tra dữ liệu có chính xác không, xuất dữ liệu theo yêu cầu…

Lớp Data Access Layer (DAL): Lưu trữ và xuất dữ liệu từ CSDL thông qua các truy

vấn SQL.

Lớp đối tượng (Object): Khai báo các đối tượng cần dùng cho report.

Page 132: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 32 | 262

3. Công cụ thực hiên:

Công cụ: Microsoft Visual Studio 2010, DevExpress 10.2, MS SQL Server…

Ngôn ngữ, nền tảng: C# Winform (lập trình trên windows)

Thành phần sử dụng chính: XtraReports của DevExpress.

II. Cơ sở lý thuyết

1. Giới thiệu về XtraReports:

XtraReports là một thành phần của DevExpress hỗ trợ lập báo cáo hoặc thống kê từ

đơn giản đến phức tạp, là một giải pháp báo cáo đa nền tảng cho phép người dùng tạo

ra một lần và sử dụng mọi lúc mọi nơi.

Các XtraReports là một công cụ có thể thực hiện việc tạo báo biểu độc lập hoặc

được tích hợp vào một số ngôn ngữ lập trình hiện nay (.NET)

Bên cạnh đó nó còn hổ trợ 1 môi trường thiết kế mạnh mẽ để đơn giản hóa việc viết

báo cáo và các quá trình thống kê khác… nó cung cấp các công cụ cần thiết để tạo ra

bất kỳ loại báo cáo nào, có thể phân cấp các báo cáo từ tổng thể đến chi tiết. bảng

hoặc các báo cáo có nhiều cột…

Đối với mỗi nền tảng hổ trợ XtraReports đều bao gồm một Print Preview cho phép

người dùng có thể xem trước khi in hoặc xuất dữ liệu khi cần thiết thông qua nhiều

định dạng như: pdf, html, mht, rtf, txt, csv, xps, excel… và các định dạng hình ảnh.

Page 133: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 33 | 262

2. Lý thuyết và yêu cầu cần nắm rõ của việc thiết kế report:

Các thành phần của 1 report:

Ví dụ minh họa 1 mẫu report

Page 134: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 34 | 262

Hiểu và xác định được các thông tin nào cần hiển thị, cách bố trí, tổ chức thông tin

của 1 report như thế nào.

Database fields: Các trường thuộc dạng CSDL (có thể là table, stored procedure,

SQL command ). Thông thường các trường trong mục này sẽ được hiển thị trong

phần detail của report.

SQL Expression Fields: Dữ liệu được tính toán từ những trường khác (ví dụ count,

sum,… hay một công thức tính toán bất kỳ)

Parameters Fields: Là các trường tham số cho XtraReports hoặc một tham số ta tự

khai báo, Report sẽ tự động thêm vào khi ta đưa một tham số vào trong database field.

Special Field: Là Các trường đặt biệt có sẵn trong XtraReports như số trang, ngày

hiện tại… Thông thường những trường này sẽ được hiển thị trong những phần header,

hoặc footer.

III. Phần nội dung

1. Các bước thực hiện tạo report từ XtraReports cho phép người dùng tự

design:

Bước 1: Trong SQL Server tạo 1 Database với tên bất kì, sau đó tạo 1 bảng với cái trường sau:

Bước 2: Insert dữ liệu vào bảng: (ở đây tôi nhập 2 đợt để demo rõ hơn)

Page 135: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 35 | 262

Bước 3: Sử dụng Visual Studio để tạo 1 Project bất kì

.

Bước 4: Tạo theo mô hình 3 lớp (3 Layer). Các bạn sử dụng lớp DataService mà thầy đã cho để

kết nối với Database đã tạo ở bước 1.

Bước 5: Tạo 1 form bất kì (ở đây tôi sử dụng form của Devexpress) để chứa report mà ta cần hiển

thị trong thư mục PresentationLayer. Sau đó thiết kế giao diện cho form theo từng bước sau:

o Tạo Panel Design cho form:

Page 136: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 36 | 262

o Kéo thả 2 thành phần của Reporting vào bất kì chổ nào trong form, không cần

chỉnh sửa ta sẽ được giao diện form như hình dưới:

Page 137: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 37 | 262

Bước 6: Tạo và thiết kế mẫu reports:

o Trong thư mục Reports chọn Add -> New Item -> Chọn XtraReport Class v10.2

-> Add.

o Trong giao diện XtraReport1 click chuột phải vào XtraReport1 -> Insert Band ->

ReportFooter, vùng dùng để chứa SQL Expression Fields.

Page 138: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 38 | 262

o Nếu không muốn hiển thị đường viền 2 bên khi in, bạn có thể kéo nó sát biên.

Bước 7: Sử dụng các thành phần của Report Controls trong Toolbox để thiết kế giao

diễn mẫu report:

Bước 8: Tạo lớp Object các thuộc tính cần sử dụng cho report:

Page 139: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 39 | 262

Bước 9: Chọn Build Solution sau đó Add lớp Object mà ta đã tạo vào DataSource

o Trong Data Source Configuration Wizard ta chọn Object -> Next:

Page 140: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 40 | 262

o Tiếp tục click chọn lớp Object đã tạo -> Next:

Bước 10: Add các Object từ DataSource vào:

Page 141: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 41 | 262

o Click vào ô cần add -> click vào biểu tượng (nằm góc trên bên phải của ô đó)

-> Chọn Data Binding -> chọn Object tương ứng cần add

o Cứ thế ta sẽ thêm cho tất cả các đối tượng cần xuất dữ liệu khi report (Biểu tượng ):

Bước 11: Tạo lớp HangHoaData trong thư mục DataLayer lấy các dữ liệu từ cơ sở dữ

liệu mà ta muốn dùng cho việc report:

Page 142: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 42 | 262

Bước 12: Tạo lớp HangHoaController lấy và đổ dữ liệu lên từ lớp HangHoaData:

o Khai báo và lấy dữ liệu từ lớp HangHoaData

*********222222222222222

o Vẫn trong lớp HangHoaController ta tạo 1 hàm list report lấy dữ liệu từ lớp

HangHoaData đổ vào List của lớp Object:

Page 143: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 43 | 262

Bước 13: Quay trở lại form mà ta đã tạo ở bước 5 tiếp tục xử lý code để đưa report lên

form:

Page 144: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 44 | 262

2. Một số demo sau khi hoàn thành:

Giao diện form khi hoạt động:

Khi Preview (xem trước):

Page 145: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 45 | 262

Báo lỗi khi nhập sai:

Page 146: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 46 | 262

IV. Tổng kết

1. Trắc nghiệm cũng cố kiến thức:

Câu 1. Quy trình nào dưới đây là đúng cho việc nhập, báo cáo và in dữ liệu ?

a. Nhận dữ liệu -> Nhập dữ liệu -> Lưu dữ liệu vào CSDL -> Yêu cầu thống kê báo

cáo -> Tự động so sánh và kiểm tra dữ liệu -> Hiển thị dữ liệu theo yêu cầu ->

Lưu trữ, in ấn.

b. Nhận dữ liệu -> Nhập dữ liệu -> Lưu dữ liệu vào CSDL -> Tự động so sánh và

kiểm tra dữ liệu -> Hiển thị dữ liệu theo yêu cầu -> Lưu trữ, in ấn.

c. Nhận dữ liệu -> Nhập dữ liệu -> Tự động so sánh và kiểm tra dữ liệu -> Lưu dữ

liệu vào CSDL -> Hiển thị dữ liệu theo yêu cầu -> Lưu trữ, in ấn.

d. Nhận dữ liệu -> Nhập dữ liệu -> Tự động so sánh và kiểm tra dữ liệu -> Hiển thị

dữ liệu theo yêu cầu -> Lưu dữ liệu vào CSDL -> Lưu trữ, in ấn.

Câu 2: Có bao nhiêu bước tạo report từ ExtraReport ?

a. 9

b. 11

c. 13

d. 15

Câu 3. Ở bước tạo form Report, ta kéo 2 thành phần nào vào form từ toolbox ?

a. XRDesignBarManager – XRDesignDockmanager.

b. XRDesignBarManager – XRDesignPannel.

c. XRDesignDockmanager – XRDesignRibbonController.

d. XRDesignPannel – XRDesignRibbonController.

Câu 4. Ở bước tạo và thiết kế mẫu Report, để tạo được ExtraReports như trong phần

hướng dẫn, ta chọn mục nào ?

a. XtraReport Wizard

b. XtraSchedulerReport Class

c. XtraReport Class

d. Report Viewer.

Page 147: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 47 | 262

Câu 5. Report 1 trang có bao nhiêu thành phần ?

a. 3

b. 4

c. 5

d. 6

Câu 6. Report nhiều trang có bao nhiêu thành phần ?

a. 3

b. 4

c. 5

d. 6

Câu 7. Thành phần nào của lớp Object dưới dây lập trình đúng ?

a.

b.

c.

d. Cả a và c điều đúng.

Câu 8. Tại DataSource Configuration Wizard. Để add được lớp Object chứa các thuộc

tính, ta chọn ?

a. Database

b. Service

c. Object

d. Sharepoint

Page 148: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 48 | 262

2. Câu hỏi lý thuyết:

Câu 1. Hãy trình bày lại các bước tạo report mà bạn nhớ ?

Câu 2. Ý nghĩa Database fields ? SQL Expression Fields ? Parameters Fields?

Special Field ?

Câu 3. Bạn thích sử dụng công nghệ nào hơn: Report, Report Viewer, ExtraReport

hay một công nghệ nào đó khác ? Lý do?

3. Câu hỏi thực hành:

Câu 1. Bạn hãy tạo thư mục Object, thêm các thuộc tính vào một lớp tùy ý. (Hãy yên

tâm, vì sẽ có người gợi ý khi bạn quên cách làm).

Câu 2. Bạn hãy thực hiện các bước: tạo form report, tạo và thiết kế Xtrareports (Có thể

tùy chỉnh kết nối dữ liệu cũng như các tham số parametter).

4. Bảng phân công:

Cao Hữu Thành Huy Soạn câu hỏi, debug code.

Lý Thế Vinh Thiết kế CSDL, thiết kế giao diện, viết code.

Lê Ngọc Chí Debug code, soạn word, power point.

Phan Hải Phú viết code, chạy chương trình, quay video

Page 149: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 49 | 262

MỤC LỤC

PHẦN I: GIỚI THIỆU .................................................................................................................. 50

I. Giới thiệu ........................................................................................................................... 50

II. Phân công nhóm ................................................................................................................. 50

PHÂN II: NỘI DUNG .................................................................................................................. 51

I. Giới thiệu phím tắt ............................................................................................................. 51

II. Tạo phím tắt ....................................................................................................................... 58

1. Access key: ..................................................................................................................... 58

2. Thuộc tính ShortcutKeys, ItemShortcut KeyTip............................................................ 59

3. Thiết lập KeyUp và KeyDown: ...................................................................................... 63

4. Quy trình tạo phím tắt cho chương trình ........................................................................ 72

5. Bài tập ............................................................................. Error! Bookmark not defined.

PHẦN III: KẾT LUẬN ................................................................................................................. 76

Page 150: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 50 | 262

PHẦN I: GIỚI THIỆU

III. Giới thiệu

Ngày nay máy vi tính trở thành phương tiện không thể thiếu đối với học tập

cũng như làm các công việc văn phòng, kỹ thuật…Phát triển song song với nó là

sự ra đời của nhiều chương trình ứng dụng giúp chúng ta quản lý, điều khiền các

hoạt động công việc, học tập của chúng ta nhanh hơn, hiệu quả và hiện đại hơn.

Nhưng nếu một chương trình mà qua rờm rà đặc biệt là vi phạm quy tắc “ba cú

click chuột” sẽ làm người sử dụng cảm thấy kho khăn, không hiểu được mục đích

yêu cầu của chương trình. Vì lý do trên nhóm chúng em đã chọn đề tài “Phím tắc

trong hương trình q ản lý” trên cơ sở nghiêm cứu và phát triển, nhóm chúng tôi

cố gắng hoàn thiện đề tài với sự giúp đở của thầy Huỳnh Lý Thanh Nhàn đã đóng

góp những ý kiến cho việc nghiêm cứu của chúng tôi cũng như trong các thức lập

trình. Bài báo được viết với mục đích giúp cho các bạn đọc biết về công dụng, hiểu

quả của phím tắt cũng như có thể thiết kế được một phần mềm hiệu quả và sáng

tạo với những phím tắt do chính bạn tạo ra.

IV. Phân công nhóm

STT Tên Chức vụ Công việc

1 Lê Thành Được Giám đốc Viết code chương trình,

quay video, kiểm tra và tập

hợp tài liệu

2 Nguyễn Thị Ngọc Hiền Nhân viên (Lao

công, tập vụ)

Soạn word (Phần I: Giới

thiệu, Phần II: Nôi dung)

3 Trần Thị Cẩm Tiên Kế toán, Kiểm

soát viên

Soạn word(Phần II: Nội

dung, Phần III: Kết luận)

4 Lương Diệu Thái Ngoại giao Soạn slide

5 Nguyễn Thị Minh Thư Thư ký Soạn slide

Page 151: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 51 | 262

PHẦN II: NỘI DUNG

I. Giới thiệu phím tắt

Bạn có thể tạo phím tắt cho bất kỳ báo cáo chuẩn hoặc tùy chỉnh nào có

tùy chọn phím tắt. Để tiết kiệm thời gian và đạt kết quả cao trong công việc,

thay vì sử dụng các thao tác chuột để di chuyển các chức năng có sẵn thì bạn

nên sử dụng các phím tắt. Liệt kê một số phím tắt cơ bản :

Page 152: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 52 | 262

Page 153: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 53 | 262

Page 154: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 54 | 262

Page 155: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 55 | 262

Page 156: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 56 | 262

Page 157: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 57 | 262

Page 158: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 58 | 262

II. Tạo phím tắt

1. Access key:

1.1. Giới thiệu:

Access Key là ký tự gạch dưới trong text của menu, menuitem, label của các

controls như button User có thể “click” vào control bằng cách nhấn ALT + Access

key

Page 159: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 59 | 262

1.2. Tạo Access key:

Hay viết code: btn_Them.Text == "&Thêm"

Khi chạy các bạn chỉ cần nhấn Alt+T thì sẽ gọi sự kiện click của btn_Them.

2. Thuộc tính ShortcutKeys, ItemShortcut KeyTip

2.1. ShortcutKeys:

Là thuộc tính của các controls trong WF. Chúng ta có thể thấy ở controls

ContextMenuStrip .

B1: Ta tạo một menu như hình bên

B2: Chọn sub-menu và trong hộp thoại Properties thiết lập thuộc tính

ShortcutKeys:

Page 160: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 60 | 262

B3: Chạy chương trình và ấn phím đã thiết lập

2.2. ItemShortcut:

Là thuộc tính của các controls trong DevExpress. Controls thông dụng

thường dùng như Ribbon control

B1: Tạo một Ribbon như hình bên:

B2: Chọn ButtonItem và trong hộp thoại Properties thiết lập thuộc tính

ItemShortcut

B3: Chạy chương trình và ấn phím đã thiết lập.

2.3. KeyTip

Cách 1:

B1: Vào Ribbon nhấn Run Designer chọn menu KeyTip

Page 161: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 61 | 262

Page 162: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 62 | 262

B2: Trong cửa sổ KeyTips tiến hành thiếp lập phím tắt theo ý muốn

B3: Chạy chương trình và nhấn phím Alt + kí tự thiết lập

Cách 2:

B1: Chọn controls muốn thiết lập trong Ribbon.

B2: Trong hộp thoại Properties. Thiết lập KeyTip theo ý muốn

Page 163: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 63 | 262

3. Thiết lập KeyUp và KeyDown:

B1: Chọn Form cần dùng phím tắt

B2: Trong hộp thoại Properties

Thuộc tính KeyPreview chọn giá trị True (Form sẽ nhận tất cả các sự kiện

nhấn phím).

B3: Trong hộp thoại Properties, chuyển sang cửa sổ Event

Để xử lý phím tắt trong windows form, ta phải cài đặt xử lý cho 1 trong

những sự kiện nhấn phím trên Form như KeyUp, KeyDown (cài đặt cho 2 sự

kiện này như nhau).

Page 164: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 64 | 262

B4: Thiết lập phím tắt Ctr+D cho nút đăng nhập:

private void Main_KeyDown(object sender, KeyEventArgs e)

{

if (e.Control && e.KeyCode == Keys.D)

iDangNhap_ItemClick(null, null);

}

B5: Chạy chương trình và ấn phím đã thiết lập.

Khi xử lý cho các sự kiện này, phím được bấm từ bàn phím được truyền vào

chương trình thông qua tham số sự kiện phím (KeyEventArgs) e.

Một số thuộc tính của tham số sự kiện phím e:

+ Alt: giá trị trả về là true: phím Alt được bấm, false: phím Alt không được bấm.

+ Control: giá trị trả về là true: phím Control được bấm, false: phím Control không

được bấm.

+ Shift: giá trị trả về là true: phím Shift được bấm, false: phím Shift không được

bấm.

+ KeyCode/ KeyData: giá trị trả về là mã/giá trị (trong danh sách các phím của

Lớp Keys) của phím được bấm trên bàn phím.

+ KeyValue: giá trị trả về là mã ASCII (số nguyên) của phím được bấm trên bàn

phím.

Tham khảo thêm bảng Mã ASCII:

Hệ 2

(Nhị phân)

Hệ 10

(Thập phân)

Hệ 16

(Thập lụ phân)

Đồ hoạ

(Hiển thị ra đượ )

Page 166: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 66 | 262

010 1101 45 2D -

010 1110 46 2E .

010 1111 47 2F /

011 0000 48 30 0

011 0001 49 31 1

011 0010 50 32 2

011 0011 51 33 3

011 0100 52 34 4

011 0101 53 35 5

011 0110 54 36 6

011 0111 55 37 7

011 1000 56 38 8

011 1001 57 39 9

011 1010 58 3A :

Page 167: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 67 | 262

011 1011 59 3B ;

011 1100 60 3C <

011 1101 61 3D =

011 1110 62 3E >

011 1111 63 3F ?

100 0000 64 40 @

100 0001 65 41 A

100 0010 66 42 B

100 0011 67 43 C

100 0100 68 44 D

100 0101 69 45 E

100 0110 70 46 F

100 0111 71 47 G

100 1000 72 48 H

Page 168: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 68 | 262

100 1001 73 49 I

100 1010 74 4A J

100 1011 75 4B K

100 1100 76 4C L

100 1101 77 4D M

100 1110 78 4E N

100 1111 79 4F O

101 0000 80 50 P

101 0001 81 51 Q

101 0010 82 52 R

101 0011 83 53 S

101 0100 84 54 T

101 0101 85 55 U

101 0110 86 56 V

Page 169: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 69 | 262

101 0111 87 57 W

101 1000 88 58 X

101 1001 89 59 Y

101 1010 90 5A Z

101 1011 91 5B [

101 1100 92 5C \

101 1101 93 5D ]

101 1110 94 5E ^

101 1111 95 5F _

110 0000 96 60 `

110 0001 97 61 A

110 0010 98 62 B

110 0011 99 63 C

110 0100 100 64 D

Page 170: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 70 | 262

110 0101 101 65 E

110 0110 102 66 F

110 0111 103 67 G

110 1000 104 68 H

110 1001 105 69 I

110 1010 106 6A J

110 1011 107 6B K

110 1100 108 6C L

110 1101 109 6D M

110 1110 110 6E N

110 1111 111 6F O

111 0000 112 70 P

111 0001 113 71 Q

111 0010 114 72 R

Page 171: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 71 | 262

111 0011 115 73 S

111 0100 116 74 T

111 0101 117 75 U

111 0110 118 76 V

111 0111 119 77 W

111 1000 120 78 X

111 1001 121 79 Y

111 1010 122 7A Z

111 1011 123 7B {

111 1100 124 7C |

111 1101 125 7D }

111 1110 126 7E ~

Page 172: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 72 | 262

4. Quy trình tạo phím tắt ho hương trình

B1: Tạo dự án window form với Dev ExtraForm Wizard (form tạo sẵn dành

cho người mới chưa sử dụng rành về devExpress) hoặc tạo dự án Window

Form thường rồi sau đó add từng control cần thiết.

B2: Xây dựng Ribbon tượng tự hình dưới đây

B3: Thiết lập thuộc tính ItemShortcut cho các Button trong Page “Hệ thống”

Đăng nhập Ctr+D

Đăng xuất Ctr+X

Sao lưu Ctr+S

Phục hồi Ctr+P

CSDL Ctr+C

Thoát Ctr+T

Xây dựng hoàn chỉnh các Page còn lại(“Danh mục”,”Nghiệp vụ”,”Trợ giúp”)

và thiết lập thuộc tính ItemShortcut cho các Button trong các Page trên.

B4: Vào Run Designer của Ribbon chọn menu KeyTip. Sau đó thiết lập

các User Key Tip là ký tự đầu tiên của tên các Page, Button tương ứng.

Với Page thì đặt một ký tự với Button thì đặt hai ký tự (đặt theo các nhớ

của từng người).

Hệ thống H

o Đăng nhập DN

o Đăng xuất DX

o Sao lưu SL

o Phục hồi PH

o CSDL CS

o Thoát TH

Danh mục D

o Thêm vào Page “Danh mục” các Button theo nhu cầu sử dụng

Page 173: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 73 | 262

o ….

Nghiệp vụ N

o ….

Trợ giúp

o Trợ giúp TR

o Thông tin TT

Thiết lập tượng tự như trên cho các ApplicationButton,

QuickAccessToolbarItems,..

B5: Add ContextMenuStrip từ toolbox vào From Main và xây dựng như hình

bên:

B6: Viết sự kiện click cho các sub-menu (Đăng nhập, Đăng xuất, Sao lưu,

Phục hồi, Cấu hình, Thoát) của menu “Hệ thống”.

B7: Thiết lập thuộc tính Shortcutkeys cho từng sub-menu trên.

Đăng nhập Ctr+D

Đăng xuất Ctr+X

Sao lưu Ctr+S

Phục hồi Ctr+P

CSDL Ctr+C

Thoát Ctr+T

B8: Tạo Access Key cho các sub-menu trên. Tại thuộc tính “Text” của các

sub-menu điền ký tự “&” vào trước ký tự mong muốn.

Đăng &nhập Alt+N

Đăng &xuất Alt+X

&Sao lưu Alt+S

&Phục hồi Alt+P

Page 174: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 74 | 262

&CSDL Alt+C

&Thoát Alt+T

5. Bài tập thực hành

1) Mở hương trình trong older “Bài tập”.

a. Cài đặt DevExpress 12.2.4 (nằm trong folder DevExpress)

b. Chạy Solution QuanLy_DatVe_MB. Vào form Main

2) Thiết lập phím tắt cho Ribbon theo thuộc tính KeyTip

a. Các Page đặt một ký tự đầu

b. Button bên trong đặt hai ký tự.

Gợi ý: (Page Hệ thông H, Page Danh mục D)

( B tton Đăng nhập N, B tton Đăng x t DX)

3) Thiết lập phím tắt cho Ribbon theo thuộc tính ItemShortcut

a. Các Button trong Page “Hệ thống” thiết lập Ctr + Tứ tự đầu

của tên Button

b. Các Button trong Page “Danh mục” sẽ thiết lập thoe thứ tự

từ trái sang phải là F1 F12.

Gợi ý: (Page Hê thống: B tton Đăng nhập “Ctr+ ”, B tton Đăng x t

“Ctr+ ”)

(Page Danh mụ : Hãng “F1” Button loại vé “F12”).

4) Tạo một ContextMenuStrip theo hình bên

Page 175: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 75 | 262

a. Tạo phím tắt cho các sub-menu (Đặng nhập, Đăng xuất, Sao

lưu,…).

Gợi ý: (Đăng nhập: Alt+ , Đăng x t Alt+ ,…).

5) Viết sự kiện KeyUp hoặc KeyDown cho form Main.

a. Khi nhấn phím Ctr+I sẽ gọi sự kiện click cho nút Thông tin

b. Khi nhấn phím X sẽ gọi sự kiện click của nút Trợ giúp

Gợi ý: (Sử dụng đối tượng KeyEventArgs e với các thuộc tính

KeyCode/KeyData và KeyValues). Viết sự kiện click cho hai nút trên.

6) Thiết kế một orm on tên là “Thông tin đăng nhập” ó nút

B tton đăng nhập, xóa, thoát.

a. Viết sự kiện cho nút đăng nhập gọi form “Thông tin đăng

nhập”.

b. Tạo Access Key cho các phím đăng nhập, xóa, thoát.

Page 176: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 76 | 262

PHẦN III: KẾT LUẬN

Một chương trình dù nó rất công phu, xử lý được các vấn đề khó hay giải

được các bài toán khó và nó có hoạt động tốt tới đâu mà nếu không sử dụng phím

tắt thì cũng chỉ là một sản phẩm không hoàn thiện sẽ không được người sử dụng

tín nhiệm. Qua bài viết hy vong sẽ giúp được bạn đọc phần nào về kiến thức và

giúp ích cho các bạn trong công việc cũng như học tập

Cuối cùng chân thành cảm ơn đến thầy Huỳnh Lý Thanh Nhàn đã tạo điều

kiện, giúp đỡ nhóm trong quá trình nghiên cứu và phát triển đề tài. Mặc dù không

được trực tiếp, hạn chế và khoảng cách và thời gian nhưng thầy đã đóng góp những

ý kiến quý báo cho nhóm xây dựng đề tài.

Xin chân thành cảm ơn !

Câu hỏi trắc nghiệm:

1. Trong phần trình bày của nhóm có bao nhiêu cách tạo phím tắc?

a.3 b.2

c.4 d.6

2. ItemShortcut là thuộc tính của các controls trong DevExpress. Controls thông

dụng thường dùng như Ribbon control đúng hay sai?

a.Đúng b.Sai

3. 100 trong Hệ 10(Hệ thập phân) là chữ gì?

a.C b.E

c.D d.A

4. ShortcutKeys là thuộc tính của các controls trong DevExpress. Chúng ta có thể

thấy ở controls ContextMenuStrip đúng hay sai?

a.Đúng b.Sai

5. Tạo Access như thế nào. Để thực hiện Access Key ta làm cách nào?

Đáp án: Đặt chữ & trước ký tự muốn thiết lập.

Page 177: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 77 | 262

Alt+Access Key

6. Liệt kê các thuộc tính của đối tượng (KeyEventArgs) e trong sự kiện KeyUp hay

KeyDown

Đáp án: Alt, Controls, Shift, KeyCode, KeyData, KeyValue

Bài tập thực hành:

1) Mở chương trình trong folder “Bài tập”.

a. Cài đặt DevExpress 12.2.4 (nằm trong folder DevExpress)

b. Chạy Solution QuanLy_DatVe_MB. Vào form Main

2) Thiết lập phím tắt cho Ribbon theo thuộc tính KeyTip

a. Các Page đặt một ký tự đầu

b. Button bên trong đặt hai ký tự.

Gợi ý: (Page Hệ thông H, Page Danh mục D)

( Button Đăng nhập DN, Button Đăng xuất DX)

3) Thiết lập phím tắt cho Ribbon theo thuộc tính ItemShortcut

a. Các Button trong Page “Hệ thống” thiết lập Ctr + Tứ tự đầu của tên

Button

b. Các Button trong Page “Danh mục” sẽ thiết lập thoe thứ tự từ trái sang

phải là F1 F12.

Gợi ý: (Page Hê thống: Button Đăng nhập “Ctr+D”, Button Đăng xuất “Ctr+X”)

(Page Danh mục: Hãng “F1” Button loại vé “F12”).

4) Tạo một ContextMenuStrip theo hình bên

Page 178: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 78 | 262

a. Tạo phím tắt cho các sub-menu (Đặng nhập, Đăng xuất, Sao lưu,…).

Gợi ý: (Đăng nhập: Alt+D, Đăng xuất Alt+X,…).

5) Viết sự kiện KeyUp hoặc KeyDown cho form Main.

a. Khi nhấn phím Ctr+I sẽ gọi sự kiện click cho nút Thông tin

b. Khi nhấn phím X sẽ gọi sự kiện click của nút Trợ giúp

Gợi ý: (Sử dụng đối tượng KeyEventArgs e với các thuộc tính KeyCode/KeyData

và KeyValues). Viết sự kiện click cho hai nút trên.

6) Thiết kế một form con tên là “Thông tin đăng nhập” có nút Button đăng nhập,

xóa, thoát.

a. Viết sự kiện cho nút đăng nhập gọi form “Thông tin đăng nhập”.

Tạo Access Key cho các phím đăng nhập, xóa, thoát.

Page 179: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 79 | 262

I.1 Giới thiệu ADO.NET

ADO.NET là một bộ các thư viện hướng đối tượng (OOP) cho phép bạn tương tác

với dữ liệu nguồn. Thông thường thì dữ liệu nguồn là một cơ sở dữ liệu (database),

nhưng nó cũng có thể là file text, exel hoặc XML. Theo những mục tiêu của hướng

dẫn này, chúng ta sẽ chỉ xem xét tới cách ADO.NET làm việc với database.

Như bạn có thể biết rằng, có rất nhiều loại database hiện nay như Microsoft SQL

Server, Microsoft Access, Oracle, Borland Interbase, và IBM DB2,… Để làm rõ hơn

phạm vi của loạt bài này, tất cả ví dụ sẽ sử dụng SQL Server 2008.

I.2 Data Provider

Chúng ta biết rằng ADO.NET cho phép tương tác với các loại dữ liệu và kiểu

database. Mỗi loại dữ liệu cần một cách thức khác nhau để có thể truy xuất. Các loại

dữ liệu cũ sử dụng giao thức ODBC, các loại dữ liệu mới hơn sử dụng giao thức

OleDb. Vì vậy cần có một thư viện thống nhất để làm việc với chúng, đây chính là lý

do mà ADO.NET được tạo ra.

ADO.NET cung cấp một cách thức chung để tương tác với nguồn dữ liệu, nhưng

với mỗi loại dữ liệu bạn phải sử dụng một thư viện khác nhau. Các thư viện này được

gọi là Data Provider và thường được đặt tên theo giao thức hoặc loại dữ liệu mà

chúng cho phép bạn truy xuất. Table 1 liệt kê các data provider phổ biến, tiền tố

(prefix) API mà chúng sử dụng và kiểu dữ liệu mà bạn có thể làm việc.

Bảng 1: Các lớp thư viện Data Provider

Page 180: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 80 | 262

I.2 Các đối tượng ADO.NET

ADO.NET bao gồm nhiều đối tượng bạn có thể dùng với dữ liệu. Phần này giới

thiệu một vài đối tượng chính bạn sẽ sử dụng. Theo tiến độ trong các bài viết sau, bạn sẽ

khám phá thêm nhiều đối tượng ADO.NET và cách chúng được sử dụng trong mỗi lesson

riêng. Các đối tượng dưới đây bắt buộc bạn phải biết để làm việc với dữ liệu khi dùng

ADO.NET.

STT CÁC ĐỐI TƯỢNG

1 SqlConnection

2 SqlCommand

3 SqlDataReader

4 DataSet

5 SqlDataAdapter

I.2.1 Đối tượng SqlConnection

Để tương tác với database, bạn phải có một kết nối tới nó. Kết nối giúp xác định

database server, database name, user name, password, và các tham số cần thiết để kết nối

tới database. Một đối tượng connection được dùng bởi đối tượng command vì thế chúng

sẽ biết database nào để thực thi lệnh.

Hình 1: Mô hình kiến trúc cách thức truy cập ADO.NET

Bảng 2: Các Đối tượng ADO.NET

Page 181: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 81 | 262

Đoạn mã SqlConnection

Hình 2: Mô hình SqlConnection được sử dụng bởi các đối tượng ADO.NET

qlConne tion onn = new qlConne tion(“ ata o r e=(lo al);Initial

Catalog=Northwind;Integrated e rity= PI”);

Bảng 3: Danh sách các tham sồ của đối tượng SqlConnection

Page 182: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 82 | 262

Sử dụng SqlConnection

Mục đích của việc tạo một đối tượng SqlConnection là để các mã lệnh ADO.NET

khác có thể làm việc được với database. Các đối tượng ADO.NET khác, như

SqlCommand và SqlDataAdapter dùng một connection như một tham số. Quá trình sử

dụng SqlConnection gồm các bước sau:

1. Tạo một SqlConnection.

2. Mở connection.

3. Truyền connection cho các đối tượng ADO.NET khác.

4. Thực hiện các thao tác database với các đối tượng ADO.NET này.

5. Đóng connection.

( Phần Này chúng tôi minh họa trong phần DeMo CSDL và Demo Video)

I.2.2 Đối tượng SqlCommand

Quá trình tương tác với database cần phải biết hành động nào bạn muốn xảy ra.

Điều này được thực hiện bởi đối tượng command. Bạn dùng đối tượng command để gửi

một câu lệnh SQL tới database. Một đối tượng command dùng một đối tượng connection

để xác định database nào sẽ được truy xuất. Bạn có thể dùng một đối tượng command

riêng lẻ để thực thi lệnh trực tiếp, hoặc để gắn một tham chiếu của đối tượng command

cho một SqlDataAdapter – đối tượng giữ các command sẽ làm việc trên một nhóm dữ

liệu như sẽ đề cập tới trong phần dưới.

Hình : mô hình kiến trúc SqlCommand

Page 183: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 83 | 262

Đoạn mã SqlCommand

qlCommand md = new qlCommand(“câu lệnh Sql”, onn);

Ghi chú: câu lệnh Sql bao gồm select, insert, delete,update (trình bài trong phần

demo CSDL mô hình 3 lớp và Demo video)

I.2.3 Đối tượng SqlDataReader

Nhiều thao tác dữ liệu đòi hỏi bạn chỉ lấy một luồng dữ liệu để đọc. Đối

tượng data reader cho phép bạn lấy được kết quả của một câu lệnh SELECT từ

một đối tượng command. Để tăng hiệu suất, dữ liệu trả về từ một data reader là

một luồng dữ liệu fast forward-only. Có nghĩa là bạn chỉ có thể lấy dữ liệu từ

luồng theo một thứ tự nhất định. Mặc dù điều này có lợi về mặt tốc độ, nhưng nếu

bạn cần phải thao tác dữ liệu, thì một DataSet sẽ là một đối tượng tốt hơn để làm

việc.

Tạo đối tượng SqlDataReader: SqlDataReader rdr = cmd.ExecuteReader();

( Phần Này chúng tôi minh họa trong phần DeMo CSDL và Demo Video)

I.2.4 Đối tượng DataSet

Đối tượng DataSet là một thể hiện của dữ liệu trong bộ nhớ. Chúng chứa

nhiều đối tượng DataTable, bên trong DataTable lại có nhiều column và row,

giống như các database table thông thường. Bạn thậm chí có thể định nghĩa dữ liệu

giữa các table để tạo các quan hệ parent-child. DataSet được thiết kế đặc biệt để

giúp quản lý dữ liệu trong bộ nhớ và để hỗ trợ các thao tác không cần kết nối

(disconnected) trên dữ liệu. DataSet là một đối tượng được dùng bởi tất cả Data

Provider, đó là lý do tại sao nó không có một Data Provider prefix trong tên gọi.

Hình : Cấu trúc DataSet

Page 184: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 84 | 262

Cách sử dụng DataSet

VD: SqlDataAdapter thực hiện các tác vụ sau, khi đổ dữ liệu vào DataSet:

1. Mở kết nối

2. Đổ dữ liệu vào DataSet (Fill)

3. Đóng kết nối

Và thực hiện các công việc sau, khi cập nhật dữ liệu nguồn với thay đổi của

DataSet:

1. Mở kết nối

2. Ghi thay đổi từ DataSet vào dữ liệu nguồn (Update)

3. Đóng kết nối

( Phần Này chúng tôi minh họa trong phần DeMo CSDL và Demo Video)

I.2.5 Đối tượng SqlDataAdapter

Data adapter chứa một tham chiếu đến đối tượng connection và mở/đóng kết

nối tự động khi đọc và ghi dữ liệu vào database.

Data adapter chứa đối tượng command cho những thao tác SELECT, INSERT,

UPDATE và DELETE trên dữ liệu.

( Phần Này chúng tôi minh họa trong phần DeMo CSDL và Demo Video)

Hình 3: kết nối và làm việc của DataSet

Page 185: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 85 | 262

CHƯƠNG II: TỔNG QUAN VỀ MÔ HÌNH 3 LAYERS

II.1 Giới thiệu mô hình 3 lớp

Mô hình 3 lớp được cấu thành từ: Presentation Layers, Business Layers, và Data

Layers. Các lớp này sẽ giao tiếp với nhau thông qua các dịch vụ (services) mà mỗi lớp cung

cấp để tạo nên ứng dụng, lớp này cũng không cần biết bên trong lớp kia làm gì mà chỉ cần

biết lớp kia cung cấp dịch vụ gì cho mình và sử dụng nó mà thôi.

Hình : kiến trúc mô hình 3 lớp

Page 186: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 86 | 262

II.2 các thành phần của mô hình 3 lớp

II.2.1 Presentation layers

Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập dữ liệu và

hiển thị kết quả/dữ liệu thông qua các thành phần trong giao diện người sử

dụng. Lớp này sẽ sử dụng các dịch vụ do lớp Business Logic cung cấp. Trong

.NET thì bạn có thể dùng Windows Forms, ASP.NET hay Mobile Forms để

hiện thực lớp này. Trong lớp này có 2 thành phần chính là User Interface

Components và User Interface Process Components. UI Components: là những phần tử chịu trách nhiệm thu thập và hiển thị

thông tin cho người dùng cuối. Trong ASP.NET thì những thành phần

này có thể là các TextBox, các Button, DataGrid… UI Process Components: là thành phần chịu trách nhiệm quản lý các

qui trình chuyển đổi giữa các UI Components. Ví dụ chịu trách nhiệm

quản lý các màn hình nhập dữ liệu trong một loạt các thao tác định trước

như các bước trong một Wizard… Lưu ý : Lớp này không nên sử dụng trực tiếp các dịch vụ của lớp Data Access

mà nên sử dụng thông qua các dịch vụ của lớp Business Logic vì khi bạn sử

dụng trực tiếp như vậy, chúng ta có thể bỏ qua các ràng buộc, các logic nghiệp

vụ mà ứng dụng cần phải có.

II.2.2 Bussiness logic layer

Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử dụng các dịch vụ

do lớp Data Access cung cấp, và cung cấp các dịch vụ cho lớp Presentation.

Lớp này cũng có thể sử dụng các dịch vụ của các nhà cung cấp thứ 3 để thực

hiện công việc của mình. Trong lớp này có các thành phần chính là Business

Components, Business Entities và Service Interface. Service Interface: là giao diện lập trình mà lớp này cung cấp cho

lớp Presentation sử dụng. Lớp Presentation chỉ cần biết các dịch vụ thông

qua giao diện này mà không cần phải quan tâm đến bên trong lớp này được

hiện thực như thế nào. Business Entities: là những thực thể mô tả những đối tượng thông tin mà

hệ thống xử lý. Các Business Entities này cũng được dùng để trao đổi thông tin

giữa lớp Presentation và lớp Data Layers. Business Components: là những thành phần chính thực hiện các dịch vụ

mà Service Interface cung cấp, chịu trách nhiệm kiểm tra các ràng buộc logic

(constraints), các qui tắc nghiệp vụ (Business Rules), sử dụng các dịch vụ bên

ngoài khác để thực hiện các yêu cầu của ứng dụng.

Page 187: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 87 | 262

II.2.3 Data layers

Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất dữ

liệu của ứng dụng. Thường lớp này sẽ sử dụng các dịch vụ của các hệ quản trị

cơ sở dữ liệu như SQL Server, Oracle,… để thực hiện nhiệm vụ của mình.

Trong lớp này có các thành phần chính là Data Access Logic, Data

Sources, Servive Agents). Data Access Logic Components (DAL) là thành phần chính chịu trách

nhiệm lưu trữ vào và truy xuất dữ liệu từ các nguồn dữ liệu – Data Sources như

RDMBS, XML, File systems…. Trong .NET Các DAL này thường được hiện

thực bằng cách sử dụng thư viện ADO.NET để giao tiếp với các hệ cơ sở dữ

liệu hoặc sử dụng các O/R Mapping Frameworks để thực hiện việc ánh xạ các

đối tượng trong bộ nhớ thành dữ liệu lưu trữ trong CSDL. Chúng ta sẽ tìm hiểu

các thư viện O/R Mapping này trong một bài viết khác. Service Agents: là những thành phần trợ giúp việc truy xuất các dịch vụ

bên ngoài một cách dễ dàng và đơn giản như truy xuất các dịch vụ nội tại. Chúng ta có thể tìm hiểu qua các đặc điểm của từng lớp trong mô hình 3

lớp. Đây là những kiến thức tóm tắt về 3 lớp, bạn nào muốn tìm hiểu kỹ có thể

tham khảo các bài viết do chính các chuyên gia của Microsoft: http://msdn.microsoft.com/en-us/library/ff648105.aspx http://msdn.microsoft.com/en-us/library/ee658109.aspx Hoặc bạn có thể Download cuốn sách “Application Architecture for

.NET: Designing Applications and Services” của Microsoft. Đây là cuốn

sách rất hữu ích và mô tả rất chi tiết về thiết kế ứng dụng theo mô hình 3 lớp. Để thiết kế một dự án Window Forms theo mô hình 3 lớp. Ta có thể có

rất nhiều cách đặt tên cho các thành phần của 3 lớp như: Cách 1: GUI, BUS, DAL Cách 2: GUI, BLL, DAL, DTO Cách 3: Presentation, BLL, DAL

( Phần Này chúng tôi minh họa trong phần DeMo CSDL và Demo Video)

Page 188: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 88 | 262

CHƯƠNG 3: CÀI ĐẶT CSDL QUẢN LÝ KHUYẾN MÃI VÀ VẤN ĐỀ LIÊN

QUAN

III. 1 Tạo CSDL Quản lý khuyến mãi

Lưu ý: CSDL quản lý khuyến mãi chúng tôi chỉ đề cập tới một số bảng dữ liệu như:

Ngành Hàng, Nhóm Hàng, đơn vị tính, sản phẩm.

III1.1 bảng NganhHang

III1.2 bảng NhomHang

III1.3 bảng ĐonViTinh

Page 189: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 89 | 262

III.1.4 bảng SanPham

III.1.5 sơ đồ Diagram

Page 190: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 90 | 262

III. 2 Cách tạo ra file SQL Database từ một Database đã có sẵn

Lưu ý: CSDL quản lý khuyến mãi đã có sẵn trên ở đường link, bạn chỉ cần download về

và chạy file script https://sites.google.com/site/nntngoctantinhoclaptrinh93

B1: click chuột phải ngay tại Database cần tạo chọn Tasks\Generate

Scripts\Next

B2: Chọn Script Entire Database All database objects. Next

Page 191: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 91 | 262

B3: chọn Advan ed để điều chỉnh

Page 192: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 92 | 262

ư ý:

Script for server version: Để điều chỉnh phiên bản SQL muốn tạo ra

(2005 hay 2008).

Types of data to script: Chọn Schema and Data (Tự tạo ra cấu trúc tạo

bảng và insert dữ liệu vào luôn

B4: Next Next Finish.

( Phần này chúng tôi minh họa trong phần Demo quay Video)

CHƯƠNG IV: HƯỚNG DẪN CÀI ĐẶT MÔ HÌNH 3 LỚP TRÊN CSDL QUẢN LÝ

KHUYẾN MÃI THEO CÁCH CỔ ĐIỂN VÀ DATASET

IV.1 Tạo Project và thư mục

Bạn hãy tạo project solution Visua Studio 2005, 2008 như hình dưới

Lớp

Bussinesslayer(Controller)

Lớp DataAcesslayer

Lớp GUI (Presenstation)

Lớp Public(Info)

DataProvider

Page 193: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 93 | 262

IV.2 Tạo lớp DataProvider.cs

B1: tại Project PM_QUANLYCHUONGTRINHKHUYENMAI add Component

vào để được class DataProvider.cs

B2: chọn Component rồi đặt tên cho class là Dataprovider.cs(DataService.cs)

Page 194: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 94 | 262

B3: chúng ta code cho lớp DataProvider.cs(DataService.cs như sau)

public partial class DATAPROVIDER : DataTable

{

private static SqlConnection conn = null;

private static string str_conn = "";

private SqlCommand _cmd;

public SqlCommand Cmd

{

get { return _cmd; }

set { _cmd = value; }

}

SqlDataAdapter _adapter;

public DATAPROVIDER()

Đặt Tên Class:

Dataprovider.cs

Chọn Vào

Component Class

Page 195: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 95 | 262

{

Staticfile.docfile_xml();

str_conn = Staticfile._str_conn;

open_cnn();

}

public static bool open_cnn()

{

try

{

conn = new SqlConnection(str_conn);

if (conn.State == ConnectionState.Closed)

{

conn.Open();

}

return true;

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

return false;

}

}

//

public void load(SqlCommand cmd)

{

_cmd = cmd;

try

{

open_cnn();

_cmd.Connection = conn;

_adapter = new SqlDataAdapter();

Page 196: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 96 | 262

_adapter.SelectCommand = _cmd;

this.Clear();

_adapter.Fill(this);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

//ham dong ket noi

public void closeconn()

{

conn.Close();

}

//

public int ExecuteNoneQuery()

{

int kq = 0;

SqlTransaction sqltr = null;

try

{

sqltr = conn.BeginTransaction();//bat dau qua trinh quan ly transaction

_cmd.Connection = conn;

_cmd.Transaction = sqltr; //gan transaction vao doi tuong cmd

_adapter = new SqlDataAdapter();

_adapter.SelectCommand = _cmd;

SqlCommandBuilder builder = new SqlCommandBuilder(_adapter);

Page 197: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 97 | 262

kq = _adapter.Update(this);

sqltr.Commit();//cam ket thuc hien thanh cong

}

catch(Exception)

{

if (sqltr != null)

sqltr.Rollback();//quay lui

}

return kq;

}

//thuc thi 1 record hayu 1 procedure

public int ExecuteNoneQuery(SqlCommand cmd)

{

int kq = 0;

SqlTransaction sqltr = null;

try

{

sqltr = conn.BeginTransaction();

cmd.Connection=conn;

cmd.Transaction = sqltr;

kq = cmd.ExecuteNonQuery();

this.AcceptChanges();

sqltr.Commit();

}

catch(Exception)

{

if (sqltr != null)

Page 198: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 98 | 262

sqltr.Rollback();

}

return kq;

}

//

public object ExecuteScalar(SqlCommand cmd)

{

object kq = null;

SqlTransaction sqltr = null;

try

{

sqltr = conn.BeginTransaction();//bat dau quan ly transaction

cmd.Connection = conn;

cmd.Transaction = sqltr;

kq = cmd.ExecuteScalar();

{}

this.AcceptChanges();

sqltr.Commit();

if (kq == DBNull.Value)

kq = null;

}

catch(Exception)

{

if (sqltr != null)

sqltr.Rollback();

}

return kq;

}

//ham chen vao csdl

Page 199: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 99 | 262

public bool insert(SqlCommand cmd)

{

if (conn== null ||conn.State == ConnectionState.Closed)

{

conn= new SqlConnection();

conn.Open();

}

_cmd = cmd;

_cmd.Connection =conn;

try

{

_cmd.ExecuteNonQuery();

}

catch (SqlException)

{

return false;

}

return true;

}

//ham update

public void update()

{

SqlCommandBuilder builder = new SqlCommandBuilder(_adapter);

_adapter.Update(this);

}

//ham ket attach csdl

public SqlDataReader ExeCutereader(SqlCommand cmd)

{

Page 200: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 100 | 262

SqlDataReader reader=null;

if (conn == null || conn.State == ConnectionState.Closed)

{

conn = new SqlConnection();

conn.Open();

}

_cmd = cmd;

_cmd.Connection = conn;

try

{

reader = _cmd.ExecuteReader();

}

catch (SqlException ex)

{

MessageBox.Show(ex.Message);

}

return reader;

}

( Phần Này chúng tôi minh họavà giải thích trong phần DeMo Class Dataprovider và

Demo Video Class DataProvider.cs)

III.3 Code mô hình 3 lớp

- Phần này chúng tôi sẽ minh họa cho các bạn từ lớp DataAcceslayer =>

BussinessLayer(Controller)=> Gui(Presenstation)

- Như chúng ta đã biết Code mô hình 3 lớp trong Ado.net có 2 cách

+ cách 1: ở cách này chúng ta không dùng các Control như textbox,

commbox để lưu dữ xuống CSDL mà chỉ dùng Control BindingNavigator

Page 201: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 101 | 262

và GridControl để lưu dữ liệu trực tiếp từ Gridcontrol xuống CSDL thông

qua các Button trên BindingNavigator.

+ cách 2: chúng ta dùng các Control textbox, combobox...ở lớp Gui Đưa dữ

liệu xuống CSDL thông qua các câu lệnh Insert, Select, Delete, Update ở

lớp DataAcessLayer.

GHI CHÚ: minh họa cách 1 ở các bảng Ngành hàng(table NganhHang),

đơn vị tính(table DonViTinh), minh họa cách 2 ở các bảng Nhóm

Hàng(table NhomHang) và Sản Phẩm(table SanPham).

III.3.1 Code 3 lớp đơn bảng đơn vị tính(table DonViTinh)

B1: Trong Lớp DataAcesslayer tạo Class DonViTinh_DT.cs

Code:

class donvitinh_dt

{

//ham hien thi csdl

DATAPROVIDER provider = new DATAPROVIDER();

// HÀM HIỂN THỊ DỮ LIỆU ĐƠN VỊ TÍNH

public DataTable hienthidulieu_donvitinh()

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "select *from DonViTinh";

provider.load(cmd);

return provider;

}

//ham save

public bool save()

{

return provider.ExecuteNoneQuery() > 0;

}

//HÀM TẠO RA DÒNG MỚI

public DataRow newrow()

{

return provider.NewRow();

}

// HÀM ADD DÒNG VÀO GRID

public void add(DataRow row)

{

provider.Rows.Add(row);

}

Page 202: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 102 | 262

//HÀM SỬA ĐỔI

public void update()

{

provider.update();

} }

B2: Trong Lớp BussinessLayer tạo class DonViTinh_Controller(DonViTinh_BSS)

class Donvitinh_BSS

{

donvitinh_dt dvt_dt = new donvitinh_dt();

//HÀM HIỂN HỊ DỮ LIỆU

public void hienthidulieu(DevExpress.XtraGrid.GridControl grid,

DevComponents.DotNetBar.Controls.BindingNavigatorEx bin)

{

BindingSource bs = new BindingSource();

DataTable table = dvt_dt.hienthidulieu_donvitinh();

bs.DataSource = table;

grid.DataSource = bs;

bin.BindingSource = bs;

}

// HÀM SAVE

public bool save()

{

return dvt_dt.save();

}

/HÀM TẠO RA DÒNG MỚI

public DataRow newrow()

{

return dvt_dt.newrow();

}

//HÀM ADD DÒNG VÀO

public void add(DataRow row)

{

dvt_dt.add(row);

}

//HÀM UPDATE SỬA ĐỔI CSDL

public void update()

{

dvt_dt.update();

Page 203: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 103 | 262

}

}

B4: Trong lớp Gui(Presentstation) tạo giao diện như hình bên dưới

Các button trên bindingnavigator code đơn giản như sau

public partial class F_DONVITINH : Form

{

public F_DONVITINH()

{

InitializeComponent();

}

Donvitinh_BSS donvitinh = new Donvitinh_BSS()

//HÀM LOAD CỦA FORM ĐƠN VỊ TÍNH

private void F_DONVITINH_Load(object sender, EventArgs e)

{

donvitinh.hienthidulieu(grid_donvitinh,bin_dvt);

}

bool temp_them = false;

//NÚT LỆNH THÊM ĐƠN VỊ TÍNH

private void bt_them_Click(object sender, EventArgs e)

{

DataRow row = donvitinh.newrow();

grid_donvitinh.Focus();

row["MaDVT"] = "";

row["TenDVT"] = "";

row["MoTa"] = "";

donvitinh.add(row);

bin_dvt.BindingSource.MoveLast();

temp_them = true;

Hình : Giao diện đơn vị tính

Page 204: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 104 | 262

}

//NÚT LỆNH LƯU ĐƠN VỊ TÍNH

private void bt_luu_Click(object sender, EventArgs e)

{

if (temp_them == true)

{

bin_dvt.BindingSource.MoveNext();

if (donvitinh.save())

{

F_DONVITINH_Load(sender, e);

MessageBox.Show("Đã Thêm Thành Công Đơn Vị Tính", "Thông

Báo");

}

else

{

F_DONVITINH_Load(sender,e);

MessageBox.Show("Lỗi! Thêm Đơn Vị Tính","THông Báo");

}

}

}

//NUT LỆNH XÓA ĐƠN VỊ TÍNH

private void bt_xoa_Click(object sender, EventArgs e)

{

DialogResult ok;

ok = MessageBox.Show("Bạn Có Muốn Xóa Mẫu Tin Này Không",

"Thông Báo",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning);

if (ok == DialogResult.OK)

{

bin_dvt.BindingSource.RemoveCurrent();

if (donvitinh.save())

{

F_DONVITINH_Load(sender, e);

MessageBox.Show("Bạn Đã Xóa Thành Công", "Thông Báo");

}

else

MessageBox.Show("Lỗi! Không Thể Nào Xoas Được Đơn Vị Tính

Này", "Thông Báo");

}

}

//HÀM SỬA ĐƠN VỊ TÍNH

Page 205: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 105 | 262

private void bt_sua_Click(object sender, EventArgs e)

{

donvitinh.update();

}

}

III.3.2 Code 3 lớp đơn bảng ngành hàng(table NganhHang)

B1: Trong Lớp DataAcesslayer tạo Class NganhHang_DT.cs

class NganhHang_DT

{

DATAPROVIDER provider = new DATAPROVIDER();

//HÀM HIỂN THỊ DỮ LIỆU NGÀNH HÀNG

public DataTable hienthidulieu_nganhhang()

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "select *from NganhHang";

provider.load(cmd);

return provider;

}

// HÀM SAVE LƯU DỮ LIỆU TIẾP XUỐNG SQL

public bool save()

{

return provider.ExecuteNoneQuery(VÀO GRID) > 0;

}

//HÀM TẠO RA DÒNG MỚI

public DataRow newrow()

{

return provider.NewRow();

}

//HÀM ADD DÒNG

public void add(DataRow row)

{

provider.Rows.Add(row);

}

}

B2: Trong Lớp BussinessLayer tạo class NganhHang_Controller(NganhHang_BSS)

Page 206: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 106 | 262

class NganhHang_BSS

{

NganhHang_DT nganhhang_bss = new NganhHang_DT();

public void hienthidulieu_nganhhang(DevExpress.XtraGrid.GridControl grid,

DevComponents.DotNetBar.Controls.BindingNavigatorEx bin, TextBoxX

mangh,TextBoxX tennh, TextBoxX mota )

{

BindingSource bs = new BindingSource();

DataTable table = nganhhang_bss.hienthidulieu_nganhhang();

bs.DataSource = table;

grid.DataSource = bs;

bin.BindingSource = bs;

mangh.DataBindings.Clear();

mangh.DataBindings.Add("Text", bs, "MaNganhH");

tennh.DataBindings.Clear();

tennh.DataBindings.Add("Text", bs, "TenNghanhHang");

mota.DataBindings.Clear();

mota.DataBindings.Add("Text", bs, "MoTa");

}

public bool save()

{

return nganhhang_bss.save();

}

public DataRow newrow()

{

return nganhhang_bss.newrow();

}

public void add(DataRow row)

{

nganhhang_bss.add(row);

}

public void loadcombo_tennganhhang(ComboBoxEx cb)

{

DataTable table = nganhhang_bss.hienthidulieu_nganhhang();

cb.DataSource = table;

cb.DisplayMember = "TenNghanhHang";

cb.ValueMember = "MaNganhH";

Page 207: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 107 | 262

}

}

B3: Trong lớp Gui(Presentstation) tạo giao diện như hình bên dưới

class NganhHang_BSS

{

NganhHang_DT nganhhang_bss = new NganhHang_DT();

public void hienthidulieu_nganhhang(DevExpress.XtraGrid.GridControl grid,

DevComponents.DotNetBar.Controls.BindingNavigatorEx bin, TextBoxX

mangh,TextBoxX tennh, TextBoxX mota )

{

BindingSource bs = new BindingSource();

DataTable table = nganhhang_bss.hienthidulieu_nganhhang();

bs.DataSource = table;

grid.DataSource = bs;

bin.BindingSource = bs;

mangh.DataBindings.Clear();

mangh.DataBindings.Add("Text", bs, "MaNganhH");

tennh.DataBindings.Clear();

tennh.DataBindings.Add("Text", bs, "TenNghanhHang");

mota.DataBindings.Clear();

mota.DataBindings.Add("Text", bs, "MoTa");

}

public bool save()

{

return nganhhang_bss.save();

Page 208: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 108 | 262

}

public DataRow newrow()

{

return nganhhang_bss.newrow();

}

public void add(DataRow row)

{

nganhhang_bss.add(row);

}

public void loadcombo_tennganhhang(ComboBoxEx cb)

{

DataTable table = nganhhang_bss.hienthidulieu_nganhhang();

cb.DataSource = table;

cb.DisplayMember = "TenNghanhHang";

cb.ValueMember = "MaNganhH";

}

}

III.3.3 Code 3 lớp hai bảng nhóm hàng(table NhomHang)

B1: Trong Lớp DataAcesslayer tạo Class NhomHang_DT.cs

class NhomHang_DT

{

DATAPROVIDER provider = new DATAPROVIDER();

public DataTable hiendulieu_nhomhang_dt()

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "select *from NhomHang,NganhHang where

NhomHang.MaNganhH=NganhHang.MaNganhH";

provider.load(cmd);

return provider;

}

public bool them_nhomhang_dt(NhomHang_PL nh_pl)

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "insert into Nhomhang

values(@MaNhomH,@MaNganhH,@TenNhomHang,@MoTa)";

cmd.Parameters.Add("MaNhomH", SqlDbType.VarChar, 10).Value =

nh_pl.Manhom;

Page 209: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 109 | 262

cmd.Parameters.Add("MaNganhH", SqlDbType.VarChar, 10).Value =

nh_pl.Manganh;

cmd.Parameters.Add("TenNhomHang", SqlDbType.NVarChar, 50).Value

= nh_pl.Tennhom;

cmd.Parameters.Add("MoTa", SqlDbType.NVarChar, 50).Value =

nh_pl.Mota;

if (provider.insert(cmd))

return true;

else

return false;

}

public bool suadoi_nhomhang_dt(NhomHang_PL nh_pl)

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "update NhomHang set

MaNganhH=@MaNganhH,TenNhomHang=@TenNhomHang,MoTa=@MoTa

where MaNhomH=@MaNhomH";

cmd.Parameters.Add("MaNhomH", SqlDbType.VarChar, 10).Value =

nh_pl.Manhom;

cmd.Parameters.Add("MaNganhH", SqlDbType.VarChar, 10).Value =

nh_pl.Manganh;

cmd.Parameters.Add("TenNhomHang", SqlDbType.NVarChar, 50).Value

= nh_pl.Tennhom;

cmd.Parameters.Add("MoTa", SqlDbType.NVarChar, 50).Value =

nh_pl.Mota;

return provider.ExecuteNoneQuery(cmd)>0;

}

public bool xoa_nhomhang_dt(NhomHang_PL nh_pl)

{

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = "delete from NhomHang where

MaNhomH=@MaNhomH";

cmd.Parameters.Add("MaNhomH", SqlDbType.VarChar, 10).Value =

nh_pl.Manhom;

return provider.ExecuteNoneQuery(cmd) > 0;

}

}

Page 210: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 110 | 262

B2: Trong Lớp BussinessLayer tạo class NhomHang_Controller(NhomHang_BSS)

class Nhomhang_BSS

{

NhomHang_DT nhomhang_bss = new NhomHang_DT();

public void hienthidulieu_nhomhang_bss(GridControl

grid,DevComponents.DotNetBar.Controls.BindingNavigatorEx bin)

{

BindingSource bs = new BindingSource();

DataTable table = nhomhang_bss.hiendulieu_nhomhang_dt();

bs.DataSource = table;

grid.DataSource = bs;

bin.BindingSource = bs;

}

public bool them_nhomhang_bss(NhomHang_PL nh_pl)

{

if (nhomhang_bss.them_nhomhang_dt(nh_pl))

return true;

else

return false;

}

public bool suadoi_nhomhang(NhomHang_PL nh_pl)

{

if (nhomhang_bss.suadoi_nhomhang_dt(nh_pl))

return true;

else

return false;

}

public bool xoa_nhomhang(NhomHang_PL nh_pl)

{

if(nhomhang_bss.xoa_nhomhang_dt(nh_pl))

return true;

else

return false;

}

}

Page 211: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 111 | 262

B3: Trong lớp Gui(Presentstation) tạo giao diện như hình bên dưới

code sẽ được thiết kế như sau

public partial class F_NHOMHANG : Form

{

public F_NHOMHANG()

{

InitializeComponent();

}

NganhHang_BSS nganhhang = new NganhHang_BSS();

Nhomhang_BSS nhomhang = new Nhomhang_BSS();

private void F_NHOMHANG_Load(object sender, EventArgs e)

{

nganhhang.loadcombo_tennganhhang(cb_tennganhhang);

nhomhang.hienthidulieu_nhomhang_bss(grid_nhomhang, bin_nhomhang);

}

private void bt_them_Click(object sender, EventArgs e)

{

NhomHang_PL nh_pl = new NhomHang_PL(txt_manhomhang.Text,

cb_tennganhhang.SelectedValue.ToString(), txt_tennhomhang.Text,

txt_mota.Text);

if (nhomhang.them_nhomhang_bss(nh_pl))

Page 212: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 112 | 262

{

F_NHOMHANG_Load(sender, e);

MessageBox.Show("Bạn Đã Thêm Thành Công Nhóm Nhóm Hàng

Hàng này", "Thông Báo");

}

else

MessageBox.Show("Lỗi! Không Thể Thêm Thông Tin Nhóm Hàng

này","Thông Báo");

}

private void bt_xoa_Click(object sender, EventArgs e)

{

NhomHang_PL nh_pl = new NhomHang_PL();

nh_pl.Manhom = txt_manhomhang.Text;

if (nhomhang.xoa_nhomhang(nh_pl))

{

F_NHOMHANG_Load(sender, e);

MessageBox.Show("Bạn Đã Xóa Thành Công Mẫu Tin này", "Thông

Báo");

}

else

MessageBox.Show("Lỗi! Không Tồn tại Mã Nhóm hàng này hoặc

Nhóm Hàng Này Đang Sử Dụng", "Thông Báo");

}

private void grid_nhomhang_Click(object sender, EventArgs e)

{

txt_manhomhang.Text =

gridview_nhomhang.GetFocusedRowCellDisplayText(gridColumn1);

txt_tennhomhang.Text =

gridview_nhomhang.GetFocusedRowCellDisplayText(gridColumn2);

txt_mota.Text =

gridview_nhomhang.GetFocusedRowCellDisplayText(gridColumn3);

cb_tennganhhang.Text =

gridview_nhomhang.GetFocusedRowCellDisplayText(gridColumn4);

}

private void bt_sua_Click(object sender, EventArgs e)

{

NhomHang_PL nh_pl = new NhomHang_PL(txt_manhomhang.Text,

cb_tennganhhang.SelectedValue.ToString(), txt_tennhomhang.Text,

txt_mota.Text);

Page 213: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 113 | 262

if (nhomhang.suadoi_nhomhang(nh_pl))

{

F_NHOMHANG_Load(sender, e);

MessageBox.Show("Bạn Đã Sửa Đổi Thành Công Nhóm Nhóm Hàng

Hàng này", "Thông Báo");

}

else

MessageBox.Show("Lỗi! Không Thể Sửa ĐThông Tin Nhóm Hàng

này", "Thông Báo");

}

}

III.3.4 Code 3 lớp bảng 3 bảng (nghiệp vụ) table SanPham

B1: Trong Lớp DataAcesslayer tạo Class SanPham_DT.cs

class SANPHAM_DT

{

DATAPROVIDER provider=new DATAPROVIDER();

public bool them_sanpham_dt(SANPHAM_PL sp_pl)

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_themsanpham";

sqlcmd.Parameters.Add("masp", SqlDbType.VarChar, 10).Value =

sp_pl.Masp;

sqlcmd.Parameters.Add("idsp", SqlDbType.NVarChar, 10).Value =

sp_pl.Idsp;

sqlcmd.Parameters.Add("madvt", SqlDbType.NVarChar, 10).Value

= sp_pl.Madvt;

sqlcmd.Parameters.Add("manhomhang", SqlDbType.NVarChar,

50).Value = sp_pl.Manhomhang;

sqlcmd.Parameters.Add("tensp", SqlDbType.NVarChar, 50).Value

= sp_pl.Tensp;

sqlcmd.Parameters.Add("soluong", SqlDbType.NVarChar,

10).Value = sp_pl.Soluong;

sqlcmd.Parameters.Add("dongianhap", SqlDbType.NVarChar,

50).Value = sp_pl.Dogianhap;

sqlcmd.Parameters.Add("dongiaban", SqlDbType.NVarChar,

50).Value = sp_pl.Dongiaban;

if (provider.insert(sqlcmd))

return true;

else

return false;

Page 214: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 114 | 262

}

public DataTable hienthidanhsach_sanpham_dt()

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_hienthi_sanpham";

provider.load(sqlcmd);

return provider;

}

public bool xoa_sanpham_dt(SANPHAM_PL sp_pl)

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_xoa_sanpham";

sqlcmd.Parameters.Add("masp", SqlDbType.VarChar, 10).Value =

sp_pl.Masp;

return provider.ExecuteNoneQuery(sqlcmd) > 0;

}

//chon san pham hang tang hang

public DataTable hienthidanhsach_sanpham_hanggiamgia_dt()

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_chonsp_giamgiahh";

provider.load(sqlcmd);

return provider;

}

public DataTable hienthidanhsach_sanphamban_dt()

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_chonsp_ban";

provider.load(sqlcmd);

return provider;

}

public DataTable hienthidanhsach_sanphamhangtanghang_dt()

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_chonsp_hangtanghang";

Page 215: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 115 | 262

provider.load(sqlcmd);

return provider;

}

//CHON MA SAN PHAM HIEN THI ID SAN PHAM

public SqlDataReader

hienthi_combobox_sanpham_IDSP_dt(SANPHAM_PL sp_pl, TextBox

text)

{

//

SqlDataReader reader = null;

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_chonmasp_hienthi_ID";

sqlcmd.Parameters.Add("masp", SqlDbType.NChar, 10).Value =

sp_pl.Masp;

reader = provider.ExeCutereader(sqlcmd);

return reader;

}

//

public bool suadoi_sanpham_dt(SANPHAM_PL sp_pl)

{

SqlCommand sqlcmd = new SqlCommand();

sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.CommandText = "proc_suadoi_sanpham";

sqlcmd.Parameters.Add("masp", SqlDbType.VarChar, 10).Value =

sp_pl.Masp;

sqlcmd.Parameters.Add("idsp", SqlDbType.NVarChar, 10).Value =

sp_pl.Idsp;

sqlcmd.Parameters.Add("madvt", SqlDbType.NVarChar, 10).Value

= sp_pl.Madvt;

sqlcmd.Parameters.Add("manhomhang", SqlDbType.NVarChar,

50).Value = sp_pl.Manhomhang;

sqlcmd.Parameters.Add("tensp", SqlDbType.NVarChar, 50).Value

= sp_pl.Tensp;

sqlcmd.Parameters.Add("soluong", SqlDbType.NVarChar,

10).Value = sp_pl.Soluong;

sqlcmd.Parameters.Add("dongianhap", SqlDbType.NVarChar,

50).Value = sp_pl.Dogianhap;

sqlcmd.Parameters.Add("dongiaban", SqlDbType.NVarChar,

50).Value = sp_pl.Dongiaban;

if (provider.insert(sqlcmd))

return true;

Page 216: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 116 | 262

else

return false;

}

B2: Trong Lớp BussinessLayer tạo class SanPham_Controller(SanPham_BSS)

class SANPHAM_BSS

{

SANPHAM_DT sanpham_bss = new SANPHAM_DT();

public bool them_sanpham_bss(SANPHAM_PL sp_pl)

{

if (sanpham_bss.them_sanpham_dt(sp_pl))

return true;

else

return false;

}

public void hienthi_sanpham_bss(DevExpress.XtraGrid.GridControl

grid, DevComponents.DotNetBar.Controls.BindingNavigatorEx bingding)

{

BindingSource bin = new BindingSource();

DataTable table = sanpham_bss.hienthidanhsach_sanpham_dt();

grid.DataSource = table;

bin.DataSource = table;

bingding.BindingSource = bin;

}

public bool xoa_sanpham_bss(SANPHAM_PL sp_pl)

{

if (sanpham_bss.xoa_sanpham_dt(sp_pl))

return true;

else

return false;

}

public void

hienthi_combo_sanphamhangtanghang(DevComponents.DotNetBar.Contro

ls.ComboBoxEx cb)

{

DataTable table =

sanpham_bss.hienthidanhsach_sanphamhangtanghang_dt();

cb.DataSource = table;

cb.ValueMember = "MaSP";

cb.DisplayMember = "TenSP";

Page 217: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 117 | 262

}

public void

hienthi_combo_sanphamgiamgiahanghoa(DevComponents.DotNetBar.Con

trols.ComboBoxEx cb)

{

DataTable table =

sanpham_bss.hienthidanhsach_sanpham_hanggiamgia_dt();

cb.DataSource = table;

cb.ValueMember = "MaSP";

cb.DisplayMember = "TenSP";

}

public void

hienthi_combo_sanphamban(DevComponents.DotNetBar.Controls.Combo

BoxEx cb)

{

DataTable table = sanpham_bss.hienthidanhsach_sanphamban_dt();

cb.DataSource = table;

cb.ValueMember = "MaSP";

cb.DisplayMember = "TenSP";

}

//chon ma sp hien thi id

public void hienthi_combobox_sanpham_IDSP_bss(SANPHAM_PL

sp_pl, TextBox text)

{

SqlDataReader reader =

sanpham_bss.hienthi_combobox_sanpham_IDSP_dt(sp_pl, text);

while (reader.Read())

{

//text.Text = reader["hoten"].ToString();

text.Text = reader.GetValue(0).ToString();

}

//

reader.Close();

reader.Dispose();

}

public bool suadoi_sanpham_bss(SANPHAM_PL sp_pl)

Page 218: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 118 | 262

{

if (sanpham_bss.suadoi_sanpham_dt(sp_pl))

return true;

else

return false;

}

B2: Trong Lớp PubLic(Info) tạo class SanPham_info(SanPham_BSS)

class SANPHAM_PL

{

private string masp;

public string Masp

{

get { return masp; }

set { masp = value; }

}

private string idsp;

public string Idsp

{

get { return idsp; }

set { idsp = value; }

}

private string madvt;

public string Madvt

{

get { return madvt; }

set { madvt = value; }

}

private string manhomhang;

public string Manhomhang

{

get { return manhomhang; }

set { manhomhang = value; }

}

private string tensp;

public string Tensp

{

Page 219: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 119 | 262

get { return tensp; }

set { tensp = value; }

}

private int soluong;

public int Soluong

{

get { return soluong; }

set { soluong = value; }

}

private float dogianhap;

public float Dogianhap

{

get { return dogianhap; }

set { dogianhap = value; }

}

private float dongiaban;

public float Dongiaban

{

get { return dongiaban; }

set { dongiaban = value; }

}

public SANPHAM_PL() { }

public SANPHAM_PL(string _masp, string _idsp,string _madvt,

string _manhomhang, string _tensp, int _soluong, float _dongianhap, float

_dongiaban)

{

masp = _masp;

idsp = _idsp;

madvt = _madvt;

manhomhang = _manhomhang;

tensp = _tensp;

soluong = _soluong;

dogianhap = _dongianhap;

dongiaban = _dongiaban;

}

B4: Trong Lớp Gui(Presenstation) tạo giao diện F_SanPham.cs

Page 220: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 120 | 262

private void F_SANPHAM_Load(object sender, EventArgs e)

{

// donvitinh.hienthi_combo_donvitinh(cb_donvitinh);

nhomhang.hienthi_combo_nhomhang(cb_tennhomhang);

rad_hth.Checked = true;

//hienthi danh sach san pham

sanpham.hienthi_sanpham_bss(grid_sanpham, bin_sanpham);

ID_SP.Enabled = false;

//

hienthi_them_sua_xoa();

}

private void bt_them_Click(object sender, EventArgs e)

{

static_button.temp_them = true;

an_them_sua_xoa();

ID_SP.Clear();

//string.Format(String.Format("{0:0,0 vnđ}", txt_giaban));

//sinh ma hang hoa chinh hang tang hang

if (hth == true)

{

string lastid = Auto_ID.laymaidcuoi_dt("SanPham", "IDSP",9);

string nextid = Auto_ID.NextID(lastid, "SPHT");

ID_SP.Text = nextid.ToString();

Page 221: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 121 | 262

}

//sinh ma hang hoa giam gia hh

if (gghh == true)

{

string lastid = Auto_ID.laymaidcuoi_dt("SanPham", "IDSP",0);

string nextid = Auto_ID.NextID(lastid, "SPGG");

ID_SP.Text = nextid.ToString();

}

//sinh âm hang hoa san pham ban

if (spb == true)

{

string lastid = Auto_ID.laymaidcuoi_dt("SanPham", "IDSP",0);

string nextid = Auto_ID.NextID(lastid, "SPBA");

ID_SP.Text = nextid.ToString();

}

}

private void bt_luu_Click(object sender, EventArgs e)

{

if (static_button.temp_them == true || static_button.temp_sua == true)

{

if (txt_ma.Text != "" && txt_ten.Text != "" && txt_soluong.Text != ""

&& txt_gianhap.Text!="" && txt_giaban.Text!="")

{

if (static_button.temp_them == true)

{

SANPHAM_PL sp_pl = new SANPHAM_PL(txt_ma.Text,

ID_SP.Text, cb_donvitinh.SelectedValue.ToString(),

cb_tennhomhang.SelectedValue.ToString(), txt_ten.Text,

int.Parse(txt_soluong.Text)

, float.Parse(txt_gianhap.Text), float.Parse(txt_giaban.Text));

SanPhamHTH_PL sphth_pl = new SanPhamHTH_PL(txt_ma.Text,

ID_SP.Text);

if (sanpham.them_sanpham_bss(sp_pl))

{

try

{

if (hth == true)

{

sanphamhangtanghang.them_sanphamhangtanghang_bss(sphth_pl); }

if (spb == true)

{ sanphamban.them_sanphamban_bss(sphth_pl); }

if (gghh == true)

Page 222: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 122 | 262

{ sanphamgiamgia.them_sanpham_giamgia_bss(sphth_pl); }

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

F_SANPHAM_Load(sender, e);

MessageBox.Show("Bạn Đã Thêm Thành Công Sản Phẩm

Này");

static_button.temp_them = false;

hienthi_them_sua_xoa();

}

else

MessageBox.Show("Lỗi! Bạn Không Thể Nào Thêm Sản

Phẩm");

}

else

{

SANPHAM_PL sp_pl = new SANPHAM_PL(txt_ma.Text,

ID_SP.Text, cb_donvitinh.SelectedValue.ToString(),

cb_tennhomhang.SelectedValue.ToString(), txt_ten.Text,

int.Parse(txt_soluong.Text)

, float.Parse(txt_gianhap.Text), float.Parse(txt_giaban.Text));

SanPhamHTH_PL sphth_pl = new SanPhamHTH_PL(txt_ma.Text,

ID_SP.Text);

if (sanpham.suadoi_sanpham_bss(sp_pl))

{

try

{

if (hth == true)

{

sanphamhangtanghang.them_sanphamhangtanghang_bss(sphth_pl); }

if (spb == true)

{ sanphamban.them_sanphamban_bss(sphth_pl); }

if (gghh == true)

{ sanphamgiamgia.them_sanpham_giamgia_bss(sphth_pl); }

}

catch (Exception ex)

{

Page 223: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 123 | 262

MessageBox.Show(ex.Message);

}

F_SANPHAM_Load(sender, e);

MessageBox.Show("Bạn Đã Thêm Thành Công Sản Phẩm

Này");

}

else

MessageBox.Show("Lỗi! Bạn Không Thể Nào Thêm Sản

Phẩm");

static_button.temp_sua = false;

hienthi_them_sua_xoa();

}

}

}

else

{

if (txt_ma.Text != "")

{

SANPHAM_PL sp_pl = new SANPHAM_PL();

sp_pl.Masp = txt_ma.Text.Trim();

if (sanpham.xoa_sanpham_bss(sp_pl))

{

F_SANPHAM_Load(sender, e);

MessageBox.Show("Bạn Đã Thêm Thành Công Sản Phẩm Này");

static_button.temp_sua = false;

hienthi_them_sua_xoa();

}

else

MessageBox.Show("Lỗi! Bạn Không Thể Nào Thêm Sản Phẩm

Này Được");

}

else

MessageBox.Show("Mã Sản Phẩm Rỗng!", "Thông Báo");

}

}

private void bt_xoa_Click(object sender, EventArgs e)

{

Page 224: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 124 | 262

static_button.temp_xoa = true;

an_them_sua_xoa();

}

private void bt_huy_Click(object sender, EventArgs e)

{

static_button.temp_sua = false;

static_button.temp_them = false;

static_button.temp_xoa = false;

hienthi_them_sua_xoa();

}

private void bt_sua_Click(object sender, EventArgs e)

{

static_button.temp_sua = true;

an_them_sua_xoa();

}

CHƯƠNG VI: CÂU HỎI BÀI TẬP THỰC HÀNH CHIA SẼ VÀ PHÂN CÔNG

CÁC CÔNG VIỆC

VI.1 Dạng câu hỏi trắc nghiệm khách quan

Câu 1: mô hình 3 lớp gồm những lớp(thành phần nào) nào ?

a. Bussiness, DataAcess,Public(info) b. DataAcess, Gui, Public(Info)

c. Gui, Bussiness, Public(info) d. Gui, DataAcess, Bussiness

Câu 2: thành phần nào hoặc lớp nào được cho ở bên dưới mà tương tác với

người dùng ?

a. Gui (Presentstation) b. Bussiness

c. Public d. DataAcess

Câu 3: công dụng của BingdingSource là gì ?

a. Thêm dữ liệu b. Lưu giữ nguồn dữ liệu

c. Xóa Dữ Liệu d. Sửa dữ liệu

Câu 4: câu lệnh CommandType.Storeprocedure?

Page 225: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 125 | 262

a. Gọi hàm insert() b. Gọi câu lệnh storeprocedure

c. Gọi hàm delete() d. Gọi hàm update()

Câu 5: đối tượng sqlconnection dùng để làm gì ?

e. Dùng để đọc dữ liệu f. Dùng để xóa dữ liệu

g. Dùng để kết nối CSDL h. Dùng để chèn tập tin

VI.2 Dạng câu hỏi lý thuyết

Cấu 1: Mô hình 3 layers gồm những lớp nào? Kể tên và nêu chức năng hoặc

nhiệm vụ của từng phần?

Câu 2: đối tượng sqlconnection dùng để làm gì? Viết câu lệnh sqlconnection

Câu 3: viết một câu lệnh ở lớp DataAcess dùng để hiên thị dữ liệu của bảng hóa

đơn(table HoaDon).

Câu 4 hãy nêu ra 3 thuộc tính thường hay sử dụng khi binding dữ liệu đến

combobox.

Câu 5: bạn hãy nêu chức năng và nhiệm vụ của lớp DataAcesslayer

VI.3 bài tập thực hành

Cài đặt mô hình 3 lớp của CSDL bên dưới

Page 226: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 126 | 262

Gợi ý làm bài: tạo ra 3 form (DMKH,HOADON,DMKHO),đối với form DMKH

và DMKHO bạn không cần dùng textbox chỉ cần dùng gridview lưu dữ liệu trực tiếp vào

CSDL giống như tôi đã minh họa ở video. Cài đặt ở form HoaDon phải có các nút lệnh

như: thêm, xóa, sửa.

Page 227: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 127 | 262

- Trong phát triển ứng dụng, để dễ quản lý các thành phần của hệ thống, cũng

như không bị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành phần có

cùng chức năng lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc

không bị chồng chéo và ảnh hưởng lẫn nhau.

- Ví dụ trong một công ty bạn có từng phòng ban, mỗi phòng ban sẽ chịu trách

nhiệm một công việc cụ thể nào đó, phòng này không được can thiệp vào công việc

nội bộ của phòng kia như Phòng tài chính thì chỉ phát lương, còn chuyện lấy tiền đâu

phát cho các anh phòng Marketing thì các anh không cần biết. Trong phát triển phần

mềm, người ta cũng áp dụng cách phân chia chức năng này. Bạn sẽ nghe nói đến

thuật ngữ kiến trúc đa tầng/nhiều lớp, mỗi lớp sẽ thực hiện một chức năng nào đó,

trong đó mô hình 3 lớp là phổ biến nhất. 3 lớp này là gì?

- Presentation, Business Logic, và Data Access. Các lớp này sẽ giao tiếp với

nhau thông qua các dịch vụ(services) mà mỗi lớp cung cấp để tạo nên ứng dụng, lớp

này cũng không cần biết bên trong lớp kia làm gì mà chỉ cần biết lớp kia cung cấp

dịch vụ gì cho mình và sử dụng nó mà thôi. Mô hình 3 lớp mà Microsoft đề nghị dùng

cho các hệ thống phát triển trên nền .NET như sau:

+ Presentation Layer(Giao diện): Lớp này làm nhiệm vụ giao tiếp với người

dùng cuối để thu thập dữ liệu và hiển thị kết quả/dữ liệu thông qua các thành phần

trong giao diện người sử dụng.

+ Business Logic Layer Lớp này thực hiện các nghiệp vụ chính của hệ

thống,sử dụng các dịch vụ do lớp Data Access cung cấp, và cung cấp các dịch vụ

cholớp Presentation.

+ Data Access Layer Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và

truy xuất dữ liệu của ứng dụng.

B.Xây dựng ứng dụng với mô hình 3 lớp.

Gồm 6.Bước để chúng ta xây dựng ứng dụng với mô hình 3 lớp :

Page 228: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 128 | 262

Bước 1: Tao cơ sở dữ liệu trong SQL.

Bước 2 :Tạo DataService: lớp này sẽ kế thừa DataTable.

Bước 3: Xây dựng lớp Data Access Layer .

Bước 4 : Xây dựng lớp Business Logic Layer .

Bước 5: Xây dựng Presentation Layer(Giao diện).

Bước 6: Xử lý sự kiện

Bước 1: Tao 1 bảng HangHoa trong SQL.

Bước 2 :Tạo DataService: lớp này sẽ kế thừa DataTable.

a. Mở Visual Studio 2010 – Tạo 1 dự án có tên là Quản lý hàng hóa – trong đó

xây dự 1 lớp dùng chung là DataService lớp này sẽ kế thừa lớp datatable.

Page 229: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 129 | 262

- b1:

- b2:

- b3:

Page 230: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 130 | 262

- b4:

- B5

Page 231: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 131 | 262

- B6:

-B7:Trong lớp DataService chúng ta viết code như sau:

Bước 3: Xây dựng lớp HangHoa_DAL .

Page 232: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 132 | 262

-bước 1:

-Bước 2:

- Các folder còn lại làm tương tự.

-Bước 3:

Page 233: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 133 | 262

- Bước 4:

- Code Class HangHoa_DAL:

Page 234: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 134 | 262

Bước 4 : Xây dựng lớp HangHoa_BLL.

-Bước 1: Tương tự như các bước 1 HangHoa_DAL đổi tên

HangHoa_DAL thành HangHoa_BLL.

- Bước 2:

Page 235: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 135 | 262

- Bước 3: Add vào 1 lớp có tên là HangHoa_BLL như bước 2 của

HangHoa_DAL.

- Bước 4:

Code như sau:

Page 236: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 136 | 262

Bước 5: Xây dựng 1 giao diện nhưng trong hình.

Page 237: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 137 | 262

Bước 6: Xử lý sự kiện

Bước 6.0: Double chuột vào frm_HangHoa viết code sau:

Bước 6.1 : Trong Sự kiên nút thêm ta viết code.

Page 238: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 138 | 262

Double chuột vào để viết code như trong hình:

Bước 6.2 : Trong sự kiện nút Xóa ta viết code như sau:

Bước 6.3 : Trong sự kiện nút lưu ta code nhu sau:

Page 239: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 139 | 262

Bước 6.4 : Trong sự kiện nút sửa ta viết code như sau.

Bước 6.5 : Trong sự kiện nút thoát ta viết code như sau.

Sau khai làm xong các bạn kéo các lớp vào đúng với các thư mực chứa nó như

hình bên dưới.

Page 240: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 140 | 262

Các bạn thực hiện 6 bước trên sẽ xây dựng được 1 ứng dụng theo mô hình 3 lớp của ADO.NET.

Câu hỏi:

Câu 1: Mô hình 3 lớp gồm những lớp nào?

Câu 2: Khi bấm vào nút thêm hiện lỗi tại sao?

Page 241: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 141 | 262

Câu 3.Hình dưới đây lỗi gì.Khi load dữ?

Page 242: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 142 | 262

Page 243: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 143 | 262

Mục lục

Phần I. Giới thiệu và các kỹ thuật .............................................................................................. 144

1. Giới thiệu. ................................................................................................................................ 144

2. Kỹ thuật. ................................................................................................................................... 144

2.1. Breakpoint là gì? .......................................................................................................... 144

2.2. Kỹ thuật.. .......................................................................................................................... 144

Phần II. Hướng dẫn .......................................................................................................................... 150

I. Hướng dẫn Add Breakpoint và Debug. ...................................................................... 150

1. Add Debugging Breakpoint (thêm điểm dừng). ................................................ 150

2. Các bước Debug. ............................................................................................................... 152

II. Hướng dẫn kỹ thuật. ........................................................................................................... 153

1. Di chuyển chuột để xem nhanh giá trị. ................................................................... 153

2. Thay đổi giá trị. ................................................................................................................. 154

3. Gán câu lệnh kế tiếp. ...................................................................................................... 154

4. Chỉnh sửa và tiếp tục. ..................................................................................................... 155

5. Cửa sổ watch thuận tiện. .............................................................................................. 156

6. Breakpoint có điều kiện. ............................................................................................... 157

7. Go to definition (nhảy tới định nghĩa hàm). ........................................................ 159

8. Cửa sổ command. ............................................................................................................. 160

Phần III. Câu hỏi ................................................................................................................................ 161

I. Lý thuyết. ................................................................................................................................. 161

II. Trắc nghiệm. .......................................................................................................................... 162

Page 244: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 144 | 262

Phần I. Giới thiệu và các kỹ thuật

1. Giới thiệu. Khi học lập trình có rất nhiều sinh viên chúng ta ít ai sử dụng đến công cụ Debug của Visual

Studio. Khi chương trình gặp lỗi hoặc kết quả sai, bạn không biết tại sao và cắm đầu vào đọc từng

dòng code. Trong khi công cụ Debug của Visual Studio (cụ thể Visual Studio 2013 cho bài hướng dẫn

hôm nay) là công cụ rất mạnh để thực hiện việc trên. Do đó hôm nay chúng ta sẽ tìm hiểu về cách sử

dụng công cụ này và các kỹ thuật tôi biết để hướng dẫn cho các bạn.

2. Kỹ thuật. 2.1. Breakpoint là gì?

Bạn muốn xem các biến cục bộ của chương trình C# khi nó thực thi và thay đổi giá trị như thế

nào, điều này rất hữu ích để đảm bảo dữ liệu trả về giá trị chính xác. Vì lí do đó công cụ Debug rất

hữu hiệu cho lập trình viên trên Visual Studio.

Để làm được việc trên chúng ta cần hiểu trước tiên về khái niệm Breakpoint và Breakpoint là gì?

Ngay sau đây tôi sẽ cho bạn biết.

Breakpoint hay còn gọi nôm na là điểm dừng mà khi chương trình thực thi khi chạy tới gặp

Breakpoint này thì chương trình sẽ tạm ngừng lại để chúng ta xem các giá trị cục bộ của các biến khi

chương trình thực thi tới điểm dừng này.

Vậy làm sao để có thể đặt Breakpoint này trong công cụ Debug của Visual Studio? Tôi sẽ hướng

dẫn các bạn ở Phần II.

2.2. Kỹ thuật.. Debug là một phần rất quan trọng trong việc lập trình. Nhưng để sử dụng hữu hiệu công cụ này

thì không phải ai cũng làm được. Nên hôm nay tôi sẽ giới thiệu cho các bạn thêm các kỹ thuật để

Debug tiết kiệm thời gian. Và sau đây tôi sẽ giới thiệu cho bạn các kỹ thuật sử dụng mà tôi biết và tất

nhiên trước tiên bạn phải nắm được khái niệm Breakpoint là gì ở trên.

Các Breakpoint

Page 245: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 145 | 262

- Di chuyển chuột để xem nhanh giá trị.

Việc di chuyển từng bước trong hàm để hiểu code sai chỗ nào, lần lượt thực hiện lời gọi hàm và

xem giá trị biểu thức… Trong trường hợp cần xem giá trị biểu thức hoặc các biến cục bộ bằng việc dò

từ danh sách sẽ rất mất thời gian nếu có một số lượng lớn các biến và biểu thức. Tuy nhiên điều dễ

dàng là chúng ta có thể di chuyển chuột tới biến, đối tượng cần xem để xem giá trị. Sau đó chỉ cần

click để mở rộng các thành phần bạn sẽ tìm thấy các thuộc tính nhanh chóng và thuận tiện.

- Thay đổi giá trị.

Trình Debug là công cụ phân tích các hành vi và nguy cơ gây ra lỗi. Nhiều lỗi được ngăn chặn

bằng cách di chuyển từng bước trong hàm để kiểm tra hành vi có như mong đợi hay không. Và bạn

có hay hỏi: “Hàm này có chạy đúng với giá trị khác, điều kiện khác… Và trong hầu hết các trường

hợp, không cần phải thay đổi mã và Debug lại mà chỉ cần di chuyển chuột lên biến và Double-click và

giá trị để thay đổi giá trị mới và tiếp tục Debug.

Giá trị khi di chuyển

chuột vào biến

Thay đổi giá trị tại đây

Page 246: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 146 | 262

- Gán câu lệnh kế tiếp.

Một trường hợp Debug điển hình là phân tích lý do một hàm bị lỗi bằng cách di chuyển từng

bước để kiểm tra. Và bạn phát hiện ra rằng hàm bị lỗi do được gọi từ một hàm khác và bạn restart

lại quá trinh Debug. Có một tưởng hay hơn là: chỉ cần kéo đánh dấu câu lệnh hình mũi tên màu vàng

tới nơi hàm bị lỗi hoặc tới đoạn code gọi hàm đó và đặt Breakpoint trong định nghĩa hàm của hàm

đó(điều này sử dụng khi những hàm ở lớp khác). Hoặc có thể sử dụng các kiểu di chuyển như: Step

into, step over, step out (qua phần hướng dẫn Breakpoint debug bạn sẽ hiểu kĩ về những cái tên

này).

Breakpoint khi Debug.

Điểm dừng trước đó

Điểm dừng thêm vào sau khi Debug

Page 247: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 147 | 262

- Chỉnh sửa và tiếp tục. Debug 1 chương trình phức tạp. Tìm thấy 1 lỗi nhưng không muốn mất thời gian ngừng lại, biên

dịch và debug trở lại lần nữa hàm được gọi cũng d ng kỹ thuật trước (Gán câu lệnh kế tiếp . Chỉ

việc khắc phục lỗi và tiếp tục debug. Visual Studio sẽ chỉnh sửa chương trình và tiếp tục debug mà

không cần restart quá trình debug.

Tuy nhiên, thủ thuật này có sự giới hạn (đối với Visula Studio 2010 trở về trước). Trước tiên, nó

không hoạt động trên các đoạn m được viết cho HĐH x64. Vào Pro ect Settings, Build page, chọn

Platform Target là x . Đừng lo lắng, target platform sẽ do mình quyết định.

Thứ hai, thủ thuật này chỉ thực hiện được trong nội bộ 1 hàm. Nếu bạn thay đổi khai báo hàm,

thêm mới hàm hoặc lớp thì phải restart lại quá trình debug.

Trước khi sửa code

Sau khi sửa code

Page 248: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 148 | 262

- Cửa sổ watch thuận tiện. Có lẽ mỗi debugger hiện đại đều có cửa sổ atch. Tuy nhiên điều tuyệt vời của Visual Studio là

sự dễ dàng mà bạn có thể thêm hoặc g bỏ các biến. Chỉ cần click 1 dòng rỗng, nhập biểu thức và

nhấn enter. Hoặc đơn giản nhấn phím delete để xóa bỏ 1 biểu thức không còn d ng đến.

Thông tin nhận được từ cửa sổ atch không chỉ giới hạn là các biến bình thường. Bạn có thể

nhập handles để truy vết số lượng handles được mở bởi ứng dụng (và tìm các handle bị leak , err

để xem m lỗi của hàm sau c ng (và d ng Tools – Error Lookup để xem mô tả có nghĩa , hoặc eax

( rax cho -bit để xem thông tin giá trị trả về của 1 hàm.

Gõ tên biến Giá trị

Điều kiện dừng

Page 249: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 149 | 262

- Breakpoint có điều kiện (condition).

Nếu trong chu k tồn tại của ứng dụng cần debug có quá nhiều vị trí cần đặt breakpoint, bạn có

thể dễ dàng đặt điều kiện cho chúng. Chỉ đơn giản đặt điều kiện cho 1 breakpoint và Visual Studio tự

động bỏ qua breakpoint nếu điều kiện chưa đúng. Điều này đặc biệt hữu ích khi đoạn m breakpoint

được gọi quá nhiều lần rất mất thời gian debug.

- Go to definition (nhảy tới định nghĩa hàm). Tính năng không liên quan trực tiếp đến debug, d ng để khám phá các pro ect lớn. Nếu bạn tìm

Điều kiện dừng Breakpoint

Page 250: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 150 | 262

bug trong đoạn code mà bạn không tự tay viết thì thường bạn sẽ hỏi: “loại nó là gì, được khai báo ở

đâu hoặc “hàm này làm việc gì .

- Cửa sổ cammand.

Visual Studio hỗ trợ cửa sổ Command (Vie –> Other Windows –> Command Windows).

Phần II. Hướng dẫn

I. Hướng dẫn Add Breakpoint và Debug. 1. Add Debugging Breakpoint (thêm điểm dừng).

Cách 1: Click chuột cột ngoài c ng bên trái phía trước đoạn code muốn dừng lại để Debug.

Page 251: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 151 | 262

Cách 2: Click chuột vào code và nhần F9 để đặt một Breakpoint ngay đó.

Cách 3: Click chuột vào code và chọn từ thanh Menu: DebugToggle Breakpoint.

Page 252: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 152 | 262

2. Các bước Debug. - Bước 1: Thêm vào một Breakpoint.

- Bước 2: Để bắt đầu Debug chúng ta bám F5 hoặc click vào Start ở chế độ Debug để bắt đầu

chạy chương trình. Bắt đầu Debug ta chờ chương trình chạy tới Breakpoint mà ta đặt.

Chú ý: Breakpoint chỉ được dừng lại khi mà chương trình thực thi tới nó. Ví dụ như khi cho

người dùng nhập dữ liệu và nhấn nút thêm vào thì khi Breakpoint được đặt trong sự kiện đó

thì sẽ dừng lại, hoặc Breakpoint được đặt trong hàm thành phần chứa trong sự kiện đó.

- Bước 3: Để kiểm tra biến cục bộ của chương trình vào trình đơn menu và chọn Debug Windows Locals.

Page 253: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 153 | 262

- Bước 4: Tìm và xem giá trị các biến.

- Bước 5: Di chuyển để tìm lỗi.

Trong phần này thông thường chúng ta hay click nút màu xanh (continue) trên thanh

công cụ để nhảy tới Breakpoint kế tiếp.

Còn có các cách sau để thực hiện nhảy từng dòng lệnh mà không cần Breakpoint kế tiếp.

o Step into (F11): Thực thi chỉ thị gọi chính nó sau đó dừng ở dòng đầu tiên của mã lệnh trong hàm.

o Step over (F10): Di chuyển tới bước kế tiếp trong mã lệnh, nhưng không dừng lại

trong hàm được gọi.

o Stop out (Shift + F11): Bỏ qua các đoạn mã trong hàm hiện hành và đi vào các

phương thức mà nó được các lớp hoặc phương thức hay sự kiện sử dụng nó.

II. Hướng dẫn kỹ thuật. 1. Di chuyển chuột để xem nhanh giá trị.

- Bước 1: Đang chạy ở chế độ Debug.

- Bươc 2: Di chuyển chuột tới biến cần xem.

Page 254: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 154 | 262

2. Thay đổi giá trị. - Bước 1: Đang chạy ở chế Debug.

- Bươc 2: Di chuyển chuột tới biến cần thay đổi.

- Bước 3: Double-click vào giá trị.

- Bước : Thay đổi giá trị.

3. Gán câu lệnh kế tiếp. - Bước 1: Đang ở chế độ Debug.

Page 255: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 155 | 262

- Bước 2: Thêm Breakpoint hoặc sử dụng Step over, Step into, Step out.

(Chi tiết xem ở đây)

Chú ý: Nếu thêm một Breakpoint thì bạn phải click continue để nhảy tới Breakpoint kế tiếp,

còn những cái kia không cần bấm continue.

4. Chỉnh sửa và tiếp tục. - Bước 1: Đang ở chế độ Debug.

- Bước 2: Chỉnh sửa code trong hàm hiện hành.

- Bước 3: Kéo dấu mũi tên về đầu hàm.

Page 256: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 156 | 262

- Bước 4: Bấm continue để thực thi lại tới Breakpoint đặt lúc đầu.

5. Cửa sổ watch thuận tiện. - Bước 1: Đang ở chế độ Debug.

Page 257: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 157 | 262

- Bước 2: Từ trình đơn Menu chọn: DebugWindowsWatch(Watch 1, hoặc cái nào tùy ý).

- Bước 3: Gõ vào tên biến hoặc hàm để xem giá trị và gõ Enter.

6. Breakpoint có điều kiện. - Bước 1: Đang ở chế độ Debug (hoặc có thể ở chế độ chưa Debug .

Page 258: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 158 | 262

- Bước 2: Thêm một Breakpoint.

- Bước 3: Right-click vào Breakpoint và chọn Condition.

- Bước : Check vào Condition và gõ điều kiện dừng vào. Radio button chọn IsTrue.

Page 259: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 159 | 262

- Bước 5: Bấm continue nếu đang ở chế độ Debug ngược lại thì bấm Start, nếu đúng điều kiện sẽ dừng lại tại Breakpoint đó.

7. Go to definition (nhảy tới định nghĩa hàm). - Bước 1: Đang ở chế độ Debug hoặc không.

- Bước 2: Right-click vào một tên hàm cần nhảy tới.

- Bước 3: Click vào Go to definition hoặc F12.

Page 260: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 160 | 262

8. Cửa sổ command. - Bước 1: Đang ở chế độ Debug.

- Bước 2: Từ Menu chọn ViewOther WindowsCommand Window.

- Bước 3: Gõ lệnh vào để xem giá trị hàm sau khi thực thi…

Page 261: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 161 | 262

- Bước 4: Nếu chưa trả về giá trị thì click continue.

Ghi chú: Vì không tìm hiểu nhiều về câu lệnh nên mình không thể hướng dẫn các câu lệnh

được.

Phần III. Câu hỏi

I. Lý thuyết. Câu 1: Trường hợp khi lập trình không có công cụ Debug bạn sẽ d ng cách nào để Debug chương

trình của bạn?

Page 262: Hướng dẫn lập trình quản lý c#

Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 162 | 262

Câu 2: Khi chạy chương trình ở chế độ Debug thì trường hợp nào chương trình sẽ dừng lại khi không

có Breakpoint nào được đặt vào?

II. Trắc nghiệm. Câu 1: Sử dụng phím nào để đặt một breakpoint vào chương trình

A. F8 B. Ctrl + F8 C. F9 D. Ctrl + F9

Câu 2: Theo tài liệu này thì có mấy bước để Debug một chương trình

A. 5 B. 4 C. 3 D. 2