Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 17

PHẦN MỀM QUẢN LÝ CỬA HÀNG BÁN TRÀ SỮA TOCOTOCO

(TOCOTOCO MANAGER)

TÀI LIỆU TESTING

Tài liệu Testing phần mềm TOCOTOCO MANAGER


Phiên bản 1.0

Ngày tạo: 05/12/2022


MỤC LỤC

CHƯƠNG 1 – STATIC TESTING....................................................................................1


1.1 Tìm hiểu về Static Testing.................................................................................................1
1.1.1 Static Testing là gì?.....................................................................................................1
1.1.2 Tại sao Static Testing là cần thiết?............................................................................1
1.1.3 Các kỹ thuật Static Testing.........................................................................................2
1.2 Phân tích Static Testing.....................................................................................................4
1.2.1 Đăng nhập....................................................................................................................4
1.2.2 Đặt món.........................................................................................................................5
1.2.3 Quản lí kho...................................................................................................................6
1.2.4 Thống kê.......................................................................................................................6
1.2.5 Quản lí dánh sách món...............................................................................................7
CHƯƠNG 2 – DYNAMIC TESTING – UNIT TESTING....................................................8
2.1 Tìm hiểu Unit Testing.........................................................................................................8
2.1.1 Unit Testing là gì?........................................................................................................8
2.1.2 Unit Testing có cần thiết không?...............................................................................8
2.1.3 Unit Testing có nhược điểm gì...................................................................................9
2.2.1 Đăng nhập....................................................................................................................9
2.2.2 Đặt món – In hóa đơn...........................................................................................................10
2.2.3 Quản lí kho – Kiểm tra số lượng..............................................................................12
2.2.4 Thống kê – Thống kê theo ngày...............................................................................13
2.2.5 Quản lí danh sách món – Update món.....................................................................14
1

CHƯƠNG 1 – STATIC TESTING

1.1 Tìm hiểu về Static Testing


1.1.1 Static Testing là gì?
Static testing là một kỹ thuật kiểm thử phần mềm để tìm kiếm lỗi trong phần
mềm/ ứng dụng mà không thực thi code. Khác với Dynamic testing đó là kỹ thuật cần
thực thi code. Kiểm thử tĩnh được thực hiện để tránh lỗi sớm trong giai đoạn đầu phát
triển phần mềm, nó cũng dễ dàng xác định lỗi và giải quyết lỗi. Nó còn giúp tìm kiếm lỗi
mà có thể không tìm thấy ở Dynamic testing.

Có 2 loại chính của kỹ thuật kiểm thử tĩnh là:

o Kiểm thử thủ công hay còn gọi là các hoạt động review.
o Kiểm thử tự động là sử dụng các tool để phân tích.

Kiểm tra tĩnh có thể được thực hiện trên các tài liệu làm việc như yêu cầu kỹ
thuật (requirement), tài liệu thiết kế (documents) , mã nguồn (Source code), kế hoạch
kiểm tra (Test plan), kịch bản thử nghiệm (test script) và các trường hợp thử nghiệm
(test case) , nội dung trang web.

1.1.2 Tại sao Static Testing là cần thiết?


 Kiểm tra tĩnh cho phép phát hiện sớm các khuyết tật trước khi thực hiện kiểm
tra động (ví dụ: trong các yêu cầu hoặc đánh giá thông số kỹ thuật thiết kế,
sàng lọc tồn đọng sản phẩm, v.v.).
 Các khiếm khuyết được phát hiện sớm thường rẻ hơn nhiều so với các
khiếm khuyết được tìm thấy sau đó trong vòng đời, đặc biệt là so với các
khiếm khuyết được tìm thấy sau khi phần mềm được triển khai và sử dụng
tích cực.
 Tăng năng suất phát triển (ví dụ: do thiết kế được cải tiến, mã dễ bảo trì hơn)
 Giảm chi phí và thời gian phát triển
 Giảm chi phí và thời gian thử nghiệm
 Xác định các khuyết tật không dễ tìm thấy bằng thử nghiệm động
 Phát hiện và sửa chữa các khuyết tật hiệu quả hơn và trước khi thực hiện
thử nghiệm động
2

1.1.3 Các kỹ thuật Static Testing

 Inspection: Ở đây mục đích chính là tìm ra các khiếm khuyết. Việc kiểm tra
được thực hiện bởi người kiểm duyệt. Đây là loại đánh giá thông thường có
một danh sách kiểm tra được chuẩn bị để kiểm tra xem tài liệu công việc
hoàn thành tới đâu.
 Walk-through: Trong loại kỹ thuật này, Leader mở một cuộc họp để giải thích
sản phẩm. Những người tham gia có thể đặt ra những câu hỏi nếu chưa hiểu
và ghi chú lại, phục vụ cho việc hoàn thành công việc.
 Peer reviews: Trong loại kiểm tra này, kiểm tra về kỹ thuật sẽ được kiểm tra 1
vòng. Việc này tiến hành để kiểm tra xem code được thực hiện theo đúng các
thông số kỹ thuật và tiêu chuẩn hay không. Nói chung các kế hoạch kiểm tra,
chiến lược kiểm thử và các tập lệnh kiểm tra được xem xét ở đây.
 Inspection: Kỹ thuật kiểm tra tĩnh trong đó tài liệu được xem xét, nhận xét một
cách không chính thức và đưa ra các ý kiến không chính thức.

1.1.4 Quy trình thực hiện Static Testing


Quy trình review gồm 5 hoạt động chính:
1. Planning
o Xác định scope, bao gồm mục đích của review, những tài liệu or
1 phần tài liệu để review, và các đặc điểm chất lượng để đánh
giá.
3

o Ước lượng effort và khung thời gian.


o Xác định các đặc điểm review như là loại review với roles,
activities, và checklist.
o Lựa chọn người để tham gia review và phân bổ vai trò.
o Xác định tiêu chí đầu vào và đầu ra cho mỗi loại formal review.
o Kiểm tra tiêu chí đầu vào được đáp ứng.
2. Initiate review
o Phân phối sản phẩm làm việc và vật liệu khác như là form log
issue, checklists, và liên quan đến sản phẩm làm việc.
o Giải thích về scope, mục tiêu, process, roles, và sản phẩm đến
những thành viên tham gia.
o Trả lời cho bất kỳ câu hỏi nào mà thành viên có thể có trong buổi
review.
3. Individual review
o Review tất cả or 1 phần sản phẩm.
o Ghi lại những lỗi tiềm năng, recommendations và question.
4. Issue communication and analysis.
o Truyền đạt các lỗi tiền năng đã được xác định.
o Phân tích lỗi tiềm năng, chỉ định quyền sở hữu và trạng thái cho nó.
o Đánh giá và ghi lại các đặc tính chất lượng.
o Đánh giá lại các phát hiện được tìm thấy với tiêu chí đầu ra để ra
quyết định review.
5. Fixing and report
o Tạo report lỗi.
o Fix lỗi tìm thấy.
o Thông báo lỗi cho mọi người.
o Ghi lại, update lại trạng thái của lỗi.
o Tập hợp số liệu (những loại formals review).
o Kiểm tra tiêu chí đầu ra được đáp ứng.
o Chấp nhận sản phẩm khi tiêu chí đầu ra đạt được.
4

1.1.5 Những lỗi chính được tìm thấy trong Static Testing
o Sai lệch so với tiêu chuẩn.
o Code không được bảo trì.
o Lỗi trong design.
o Lỗi trong requirement.
o Thông số kỹ thuật không nhất quán.
o Thông thường, lỗi được phát hiện trong quá trình kiểm thử tĩnh là
do lỗ hổng bảo mật, các biến không được khai báo, vi phạm ranh
giới, vi phạm cú pháp, giao diện không nhất quán…

1.2 Phân tích Static Testing


1.2.1 Đăng nhập

Đăng Nhập

Các lỗi có thể xảy ra Phân tích lỗi, trạng Hướng giải quyết
thái sau khi xảy ra
lỗi

Username trống Không thể đăng Ràng buộc dữ liệu trong SQL hoặc ràng
nhập buộc trường dữ liệu khác null

Password trống Không thể đăng Ràng buộc dữ liệu trong SQL hoặc ràng
nhập buộc trường dữ liệu khác null

Username và password Không thể đăng Ràng buộc dữ liệu trong SQL hoặc ràng
đều trống nhập buộc trường dữ liệu khác null

Username và password là Không thể đăng Ràng buộc dữ liệu trong SQL hoặc ràng
biến chưa được định nghĩa nhập buộc trường dữ liệu khác là
char/varchar
5

1.2.2 Đặt món

Đặt món - In hóa đơn

Các lỗi có thể Phân tích lỗi, trạng thái Hướng giải quyết
xảy ra sau khi xảy ra lỗi

Nhiều hơn 5 loại Không thanh toán được Gán giá trị số lượng món bé hơn hoặc
món bằng 5

Thiếu priceList Không đặt được món Kiểm tra đầu vào, thêm ràng buộc priceList
khác null

Thiếu countList Không đặt được món Kiểm tra đầu vào, thêm ràng buộc countList
khác null

Thiếu sizeList Không đặt được món Kiểm tra đầu vào, thêm ràng buộc
sizeList khác null

Thiếu type Không đặt được món Kiểm tra đầu vào, thêm ràng buộc type khác
null

Thiếu iceList Không đặt được món Kiểm tra đầu vào, thêm ràng buộc iceList
khác null

Thiếu sugarList Không đặt được món Kiểm tra đầu vào, thêm ràng buộc sugarList
khác null

Thiếu date Không đặt được món Kiểm tra đầu vào, thêm ràng buộc date
khác null

Thiếu finalPrice Không thanh toán được Kiểm tra đầu vào, thêm ràng buộc finalPrice
khác null

Hóa đơn trống Không thanh toán được Thêm các biến cần thiết vào hóa đơn

Đầu vào không Không thanh toán được Định nghĩa lại các biến đầu vào, kiểm tra
xác định các biến đã định nghĩa.
6

1.2.3 Quản lí kho

Quản lí kho - Kiểm ra số lượng nguyên liệu

Các lỗi có thể xảy ra Phân tích lỗi, trạng Hướng giải quyết
thái sau khi xảy ra
lỗi

Số lượng nguyên liệu trong Không thông báo hết Tạo function thông báo cho người dùng
kho bằng 3 hàng biết nguyên liệu trong kho sắp hết

Số lượng nguyên liệu trong Không thông báo hết Tạo function thông báo cho người dùng
kho bằng 4 hàng biết nguyên liệu trong kho sắp hết

Số lượng nguyên liệu trong Không thông báo hết Tạo function thông báo cho người dùng
kho bằng 5 hàng biết nguyên liệu trong kho sắp hết

Số lượng nguyên liệu trong Không thông báo hết Kiểm tra đầu vào, thêm ràng buộc số
kho bằng rỗng hàng lượng khác null

Số lượng nguyên liệu trong Không thông báo hết Định nghĩa lại các biến đầu vào, kiểm
kho là biến không xác định hàng tra các biến đã định nghĩa.

1.2.4 Thống kê

Thống kê - Thống kê theo ngày

Các lỗi có thể xảy ra Phân tích lỗi, trạng thái Hướng giải quyết
sau khi xảy ra lỗi

Số cột trống Không có số liệu thống kê Kiểm tra đầu vào, thêm ràng buộc số
cột khác null

Mã mặt hàng trống Không có số liệu thống kê Kiểm tra đầu vào, thêm ràng buộc mã
mặt hàng khác null

Số lượng trống Không có số liệu thống kê Kiểm tra đầu vào, thêm ràng buộc số
lượng khác null

Số cột, mã mặt hàng, số Không có số liệu thống kê Kiểm tra đầu vào, thêm ràng buộc đầu
lượng đều trống vào khác null

Đầu vào không xác định Không có số liệu thống kê Định nghĩa lại các biến đầu vào, kiểm
tra các biến đã định nghĩa.
7

1.2.5 Quản lí dánh sách món

Quản lí danh sách món - Update món

Các lỗi có thể Phân tích lỗi, trạng thái sau Hướng giải quyết
xảy ra khi xảy ra lỗi

Mã mặt hàng Không update được Kiểm tra đầu vào, thêm ràng buộc mã hàng
rỗng khác null

Tên mặt hàng Không update được Kiểm tra đầu vào, thêm ràng buộc tên mặt
rỗng hàng khác null

Thiếu giá tiền Không update được Kiểm tra đầu vào, thêm ràng buộc giá tiền
khác null

Đầu vào không Bão lỗi Định nghĩa lại các biến đầu vào, kiểm tra
xác định các biến đã định nghĩa.
8

CHƯƠNG 2 – DYNAMIC TESTING – UNIT TESTING

2.1 Tìm hiểu Unit Testing


2.1.1 Unit Testing là gì?
Unit Test là phương pháp trong đó các thành phần hoặc đơn vị phần mềm riêng
lẻ được kiểm tra để xác định sự phù hợp của chúng với các thông số kỹ thuật được
thiết kế và cũng bao gồm kiểm tra dữ liệu liên quan và quy trình sử dụng. Một đơn vị chỉ
đơn giản là một đoạn mã nhỏ cho bất kỳ chức năng nào. Bản thân bài kiểm tra đơn vị là
một đoạn mã ngắn hoặc đoạn mã được thiết kế để xác minh hành vi của một đơn vị cụ
thể để tạo ra kết quả vượt qua hoặc thất bại.

Mục đích của thử nghiệm đơn vị là cho phép các nhà phát triển chạy càng nhiều
thử nghiệm đơn vị càng tốt để xác định các lỗ hổng tiềm năng. Khi ứng dụng đã vượt
qua thử nghiệm đơn vị, các hình thức thử nghiệm khác sau đó sẽ cần được áp dụng để
xác nhận thêm.

2.1.2 Unit Testing có cần thiết không?


Thực tế không phải chỉ riêng mỗi nghề viết code dạo mới có sử dụng Unit test. Các
nghề khác như siêu thị chẳng hạn, việc làm này là thường xuyên mỗi ngày, thậm chí mỗi giờ. Ví
dụ, check xem trứng có hư chưa, Sữa có tươi, rau có thối không... Chính vì vậy có thể kết luận
luôn là Unit test là rất quan trọng. Và câu trả lời đương nhiên là cần thiết với một Lập Trình Viên
có trách nhiệm với những dòng code của chính bản thân mình.

o Unit Testing giúp phát triển ứng dụng nhanh hơn: Một khi các developer viết các
test case thì việc gỡ bug sẽ ít dành thời gian hơn và sau đó sẽ tự tin hơn về việc
thực hiện các thay đổi code. Những kỹ năng về mọi mặt sẽ phát triển nhanh hơn
các Lập Trình Viên bình thường. Tính cẩn thận và trách nhiệm trong những bài
unit test cũng khẳng định ở bên ngoài cuộc sống của họ.
o Unit Testing giúp có cấu trúc code tốt hơn: Khi các nhà phát triển viết unit tests,
sự nhấn mạnh của họ là suy nghĩ về cách mã của họ sẽ được sử dụng trên toàn
hệ thống, điều này thường dẫn đến thiết kế tốt hơn. Và còn nhiều lợi ích khác
như là giảm công việc cho các tester, giảm giá thành chi phí code, giúp giảm chi
phí cho việc bảo trì trong tương lai…
9

2.1.3 Unit Testing có nhược điểm gì

Mặc dù các lợi ích của Unit Test đang bắt đầu được hiểu rộng rãi hơn, nhưng vẫn còn
một số lý do tại sao nó không được áp dụng đầy đủ hơn, điều này khiến tiềm năng của nó
không được thực hiện.

o Unit Testing gây mất thời gian: Viết Unit Test là tốn thời gian đó là lý do tại sao
rất khó để đáp ứng thời hạn. Trong thực tế, Unit Test có thể tiết kiệm rất nhiều
thời gian và nỗ lực phát triển trong thời gian dài.
o Unit Testing khác với viết code: Đúng, bạn hãy nghĩ rằng để viết được một unit
test đôi khi còn mất thời gian hơn viết một chức năng code. Và có thể có những
Lập Trình Viên viết được code nhưng chưa chắc viết được test case. Không có
gì đảm bảo, ngay cả khi mã được kiểm tra kỹ lưỡng, sẽ không có lỗi.

2.2 Implement Unit Testing

2.2.1 Đăng nhập


private void btnLogin_Click(object sender, EventArgs e)
{
string connectionSTR = "Data Source=(LocalDB)\\
MSSQLLocalDB;Initial Catalog=TOCOTOCO;Integrated Security=True";
SqlConnection connection = new SqlConnection(connectionSTR);

string query = "SELECT Username, Pwd from NhanVien WHERE Username


='"+textUsername.Text + "'and Pwd='" + textPwd.Text + "'";
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
DataTable data = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.Fill(data);
if(textPwd.Text =="" && textUsername.Text == "")
{
MessageBox.Show("Vui lòng nhập username và password");
}else if(textUsername.Text == "" || textPwd.Text == "")
{
MessageBox.Show("Vui lòng điền đầy đủ username và password");
}
else if (data.Rows.Count > 0)
{
txtUsername = textUsername.Text;
TrangChu tc = new TrangChu();
this.Hide();
tc.ShowDialog();
this.Show();
}
else
10

{
MessageBox.Show("Sai ten dang nhap hoac mat khau");
}

//Python Unit Test


//input:
//input sample: {input: username, password, expected: boolean}
let testCases = [
{input: 'admin', '123456', expected: "true"},
{input: '123', '123456', expected: "true"},
{input: '', '123456', expected: "false"},
{input: 'user', '', expected: "false"},
{input: '', '', expected: "false"},
{input: undefined, undefined, expected: undefined}
]

//output:
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"

2.2.2 Đặt món – In hóa đơn


private void button2_Click(object sender, EventArgs e)
{
string connectionSTR = "Data Source=(LocalDB)\\
MSSQLLocalDB;Initial Catalog=TOCOTOCO;Integrated Security=True";
SqlConnection connection = new SqlConnection(connectionSTR);
string query1 = "UPDATE NguyenLieu SET SoLuongKho = SoLuongKho -
1";
SqlCommand command1 = new SqlCommand(query1, connection);
DataTable data1 = new DataTable();
SqlDataAdapter adapter1 = new SqlDataAdapter(command1);
adapter1.Fill(data1);
if (dataGridView3.Rows.Count > 5)
{
MessageBox.Show("Một hóa đơn tối đa 5 loại món, vui lòng nhập
lại!");
}
else
{
string finalPrice = textBox4.Text;
List<String> nameList = new List<string>();
List<String> priceList = new List<string>();
List<String> countList = new List<string>();
List<String> sizeList = new List<string>();
List<String> iceList = new List<string>();
11

List<String> sugarList = new List<string>();

string[] name = { };
string[] price = { };
string[] count = { };
string[] size = { };
string[] ice = { };
string[] sugar = { };
string type = dataGridView3.Rows[0].Cells[4].Value.ToString();
string date = dataGridView3.Rows[0].Cells[7].Value.ToString();

for (int i = 0; i < dataGridView3.Rows.Count; i++)


{
nameList.Add(dataGridView3.Rows[i].Cells[0].Value.ToString
());
priceList.Add(dataGridView3.Rows[i].Cells[1].Value.ToStrin
g());
countList.Add(dataGridView3.Rows[i].Cells[2].Value.ToStrin
g());
sizeList.Add(dataGridView3.Rows[i].Cells[3].Value.ToString
());
iceList.Add(dataGridView3.Rows[i].Cells[5].Value.ToString(
));
sugarList.Add(dataGridView3.Rows[i].Cells[6].Value.ToStrin
g());

InHoaDon bill = new InHoaDon(nameList, priceList, countList,


sizeList, type, iceList, sugarList, date, finalPrice);
this.Hide();
bill.ShowDialog();
this.Show();
}

//Python Unit Test

//input:
//input sample
//{input: dataGridView3.Rows.Count, nameList, priceList, countList,
sizeList, type, iceList, sugarList, date, finalPrice, expected: boolean}

let testCases = [
{input: 1, 'TRA SUA', 48000, 1, 'L', 'LH001', '70%', '100%',
'13/12/2022', 48000, expected: "true"},
{input: 6, 'TRA SUA', 48000, 1, 'L', 'LH001', '70%', '100%',
'13/12/2022', 48000, expected: "false"},
{input: 2, 'TRA DAO', 7, 'M', 'LH001', '100%', '70%', '13/12/2022',
42000, expected: "false"},
12

{input: 3, 'TRA SUA', 48000, 'L', 'LH002', '50%', '50%', '13/12/2022',


48000, expected: "false"},
{input: 1, 'TRA DAO', 42000, 1, 'LH002', '70%', '70%', '13/12/2022',
42000, expected: "false"},
{input: 4, 'TRA DAU', 38000, 4, 'M', '100%', '100%', '13/12/2022',
38000, expected: "false"},
{input: 1, 'TRA O LONG', 54000, 3, 'L', 'LH002', '70%', '13/12/2022',
54000, expected: "false"},
{input: 2, 'SUA CHUA', 44000, 1, 'M', 'LH001', '100%', '13/12/2022',
44000, expected: "false"},
{input: 5, 'HONG TRA', 46000, 5, 'L', 'LH002', '70%', '50%', 46000,
expected: "false"},
{input: '', '', '', '', '', '', '', '', '', expected: "false"},
{input: undefined, undefined, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, expected: undefined},

//output:
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"
6: "passed"
7: "passed"
8: "passed"
9: "passed"
10: "passed"
11: "passed"

2.2.3 Quản lí kho – Kiểm tra số lượng


void loadNguyenLieuSapHet()
{
string connectionstr = "data source=(localdb)\\
mssqllocaldb;initial catalog=tocotoco;integrated security=true";
SqlConnection connection = new SqlConnection(connectionstr);

string query = "select * from dbo.nguyenlieu where SoLuongKho <


3";
connection.Open();

SqlCommand command = new SqlCommand(query, connection);


DataTable data = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.Fill(data);
connection.Close();
dtgvSapHet.DataSource = data;
}
13

//Python Unit Test

//input:
//input sample: {input: SoLuongKho, expected: boolean}

let testCases = [
{input: 1, expected: "true"},
{input: 2, expected: "true"},
{input: 3, expected: "false"},
{input: 4, expected: "false"},
{input: 5, expected: "false"},
{input: '', expected: "false"},
{input: undefined, expected: undefined},
]

//output:
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"
6: "passed"
7: "passed"

2.2.4 Thống kê – Thống kê theo ngày


public ThongKeTheoNgay()
{
InitializeComponent();

string connectionstr = "data source=(localdb)\\


mssqllocaldb;initial catalog=tocotoco;integrated security=true";
SqlConnection connection = new SqlConnection(connectionstr);

string query = "select distinct MaMH from dbo.ChiTietHD";


connection.Open();
SqlCommand command = new SqlCommand(query, connection);
DataTable data = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.Fill(data);
connection.Close();
dataGridView2.DataSource = data;

string query1 = "select count(*) from dbo.ChiTietHD group by


MaMH";
connection.Open();
SqlCommand command1 = new SqlCommand(query1, connection);
DataTable data1 = new DataTable();
14

SqlDataAdapter adapter1 = new SqlDataAdapter(command1);


adapter1.Fill(data1);
connection.Close();
dataGridView3.DataSource = data1;

for (int i = 0; i < dataGridView2.Rows.Count; i++)


{
string a = dataGridView2.Rows[i].Cells[0].Value.ToString();
int b =
Int32.Parse(dataGridView3.Rows[i].Cells[0].Value.ToString());
chart1.Series[0].Points.AddXY(a, b);
}
}

//Python Unit Test

//input:
//input sample: {input: dataGridView2,
dataGridView2.Rows[i].Cells[0].Value.ToString(),
// Int32.Parse(dataGridView3.Rows[i].Cells[0].Value.ToString()),
expected: boolean of (chart1.Series[0].Points.AddXY(a, b))}

let testCases = [
{input: 5, 'MH001', 2, expected: "true"},
{input: 1, 'MH002', 3, expected: "true"},
{input: '', 'MH003', 9, expected: "false"},
{input: 2, '', 2, expected: "false"},
{input: 6, 'MH004', '', expected: "false"},
{input: '', '', '', expected: "false"},
{input: undefined, undefined, undefined, expected: undefined},
]

//output:
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"
6: "passed"
7: "passed"

2.2.5 Quản lí danh sách món – Update món


private void button1_Click_1(object sender, EventArgs e)
{
string connectionstr = "data source=(localdb)\\
mssqllocaldb;initial catalog=tocotoco;integrated security=true";
SqlConnection connection = new SqlConnection(connectionstr);
15

string query = "Update mathang set TenMH=@TenMH, DonGia=@DonGia


where MaMH = @MaMH";
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@MaMH", idBox.Text);
command.Parameters.AddWithValue("@TenMH", nameBox.Text);
command.Parameters.AddWithValue("@DonGia", priceBox.Text);

command.ExecuteReader();
connection.Close();

MessageBox.Show("Update thanh cong");


}

//Python Unit Test

//input:
//input sample: {input: idBox.Text, nameBox.Text, priceBox.Text, expected:
"Update thanh cong}

let testCases = [
{input: "MH001", "TRA SUA", 38000, expected: "Update thanh cong"},
{input: "MH002", "TRA DAU", 44000, expected: "Update thanh cong"},
{input: "", "TRA SUA", 38000, expected: "false"},
{input: "MH001", "", 38000, expected: "false"},
{input: "MH001", "TRA SUA", , expected: "false"},
{input: undifined, undifined, undifined, expected: undifined},
]

//output:
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"
6: "passed"

You might also like