Upload
an-nguyen
View
10.112
Download
1
Embed Size (px)
Citation preview
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
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.
- 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
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:
- 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.
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
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”;
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 đã
đượ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;\
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à
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
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
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. }
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. }
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. }
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 = { '\\' };
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();
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. }
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)
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
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
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.
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.
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
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.
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);
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);
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:
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.
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 đó.
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 . . . . . . . . . . . .
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 !
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.
Đề 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
Đề 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.
Đề 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
Đề 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 độ
Đề 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).
Đề 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ả:
Đề 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
Đề 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
Đề 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ý
Đề 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ả:
Đề 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
Đề 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
Đề 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
Đề 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ả:
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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…
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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 :
Đề 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.
Đề 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 :
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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ê
Đề 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ả
Đề 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.
Đề 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
Đề 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
Đề 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
Đề 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ê.
Đề 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ả.
Đề 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
Đề 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ả.
Đề 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 đó.
Đề 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
Đề 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.
Đề 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
Đề 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
Đề 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 .
Đề 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
Đề 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ế.
Đề 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.
Đề 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.
Đề 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.
Đề 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.
Đề 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ử
Đề 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).
Đề 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.
Đề 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",
Đề 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
Đề 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
Đề 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.
Đề 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ệ.
Đề 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.
Đề 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ử
Đề 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ư
Đề 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
Đề 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ỉ
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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.
Đề 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.
Đề 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
Đề 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.
Đề 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ị.
Đề 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
Đề 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ý.
Đề 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.
Đề 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.
Đề 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
Đề 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.
Đề 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.
Đề 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
Đề 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)
Đề 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:
Đề 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:
Đề 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.
Đề 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:
Đề 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:
Đề 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:
Đề 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:
Đề 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:
Đề 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:
Đề 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):
Đề 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:
Đề 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.
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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 :
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 52 | 262
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 53 | 262
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 54 | 262
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 55 | 262
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 56 | 262
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 57 | 262
Đề 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
Đề 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:
Đề 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
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 61 | 262
Đề 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
Đề 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).
Đề 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 đượ )
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 65 | 262
010 0000 32 20 Khoảng trống (␠)
010 0001 33 21 !
010 0010 34 22 "
010 0011 35 23 #
010 0100 36 24 $
010 0101 37 25 %
010 0110 38 26 &
010 0111 39 27 '
010 1000 40 28 (
010 1001 41 29 )
010 1010 42 2A *
010 1011 43 2B +
010 1100 44 2C ,
Đề 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 :
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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 ~
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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.
Đề 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
Đề 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.
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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)
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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)
Đề 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
Đề 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();
Đề 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);
Đề 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)
Đề 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
Đề 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)
{
Đề 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
Đề 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);
}
Đề 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();
Đề 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
Đề 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
Đề 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)
Đề 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";
Đề 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();
Đề 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;
Đề 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;
}
}
Đề 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;
}
}
Đề 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))
Đề 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);
Đề 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;
Đề 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";
Đề 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;
Đề 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";
Đề 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)
Đề 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
{
Đề 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
Đề 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();
Đề 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)
Đề 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)
{
Đề 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)
{
Đề 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?
Đề 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
Đề 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.
Đề 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 :
Đề 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.
Đề 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:
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 130 | 262
- b4:
- B5
Đề 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 .
Đề 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:
Đề 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:
Đề 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:
Đề 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:
Đề 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.
Đề 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.
Đề 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:
Đề 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.
Đề 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?
Đề 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ữ?
Đề tài: Kỹ thuật test trong một chương trình quản lý P a g e 142 | 262
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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
Đề 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.
Đề 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.
Đề 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.
Đề 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.
Đề 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.
Đề 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.
Đề 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.
Đề 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 .
Đề 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.
Đề 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.
Đề 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…
Đề 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?
Đề 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