Skip to main content

Làm quen với SpecFlow+

Trong bài viết này, mình chỉ tổng hợp các bước để hiểu sơ lược về SpecFlow, và các bước để tạo 1 project .NET Core để thực thi SpecFlow. Với góc độ của 1 .NET programmer, mình chỉ mong muốn đây là bài tổng hợp thật rõ ràng và đơn giản.

Đầu tiên bạn cần nắm các khái niệm về TDD, BDD, và đây là nền tảng cơ sở để bắt đầu làm việc với SpecFlow, 1 .NET framework thực thi BDD, dựa trên ngôn ngữ C# và Gherkin.

TDD là gì

TDD (Test Driven Development) là một phương thức làm việc, hay một quy trình viết mã hiện đại. Lập trình viên sẽ thực hiện thông qua các bước nhỏ (BabyStep) và tiến độ được đảm bảo liên tục bằng cách viết và chạy các bài test tự động (automated tests). Quá trình lập trình trong TDD cực kỳ chú trọng vào các bước liên tục sau:
  1. Viết 1 test cho hàm mới. Đảm bảo rằng test sẽ fail.
  2. Chuyển qua viết code sơ khai nhất cho hàm đó để test có thể pass.
  3. Tối ưu hóa đoạn code của hàm vừa viết sao cho đảm bảo test vẫn pass và tối ưu nhất cho việc lập trình kế tiếp
  4. Lặp lại cho các hàm khác từ bước 1

Cycle BDD là gì? 

Behavior Driven Development (BDD) là một phần mở rộng của TDD. Giống như ở TDD, trong BDD chúng ta cũng viết các bài test trước và sau đó mới code ứng dụng để vượt qua những bài test đó. Sự khác biệt chính của BDD so với TDD chính là:
  • Các bài test hay các test case sẽ được viết bằng ngữ pháp tiếng Anh và mô tả rất đơn giản
  • Các bài test được xem như là hành vi của ứng dụng dựa trên những nhu cầu thực tế của người dùng với ứng dụng đó
  • Sử dụng các ví dụ để làm rõ các yêu cầu của ứng dụng
Hình ảnh bên dưới là ví dụ về những gì khách hàng có trong tâm trí của họ và truyền đạt cho nhóm các nhà phát triển và cách các nhà phát triển hiểu nó và làm việc với nó. Và đó là lý do tại sao nên sử dụng BDD thay vì TDD
Preception 

Gherkin là gì?

Gherkin là một ngôn ngữ đơn giản, nhẹ và có cấu trúc, sử dụng ngôn ngữ nói thông thường để mô tả các yêu cầu và kịch bản. Theo ngôn ngữ thông thường, chúng tôi có nghĩa là tiếng Anh, tiếng Pháp và khoảng 30 ngôn ngữ nữa.
Để hiện thực hóa BDD và Gherkin, chúng ta dùng SpecFlow

SpecFlow

Cài đặt

Bạn cần cài đặt các công cụ sau:
Hoặc bạn có thể cài đặt bằng cách: Menu => Extensions => Manage Extensions => Search SpecFlow => Download và cài đặt. Restart Visual Studio 2019

Ví dụ

Trong dự án này, bạn cần tạo 2 projects: 
  • Class Library: Project này chỉ chứa hàm Add để cộng 2 số
  • MSTest Test Project (.NET Core): dùng để chạy SpecFlow để kiểm tra kết quả 2 số
Tạo mới 1 Class Library, đặt tên là ExampleLibrary. Tạo 1 file class Calculator.cs với nội dung sau

public class Calculator
{
 public int FirstNumber { get; set; }
 public int SecondNumber { get; set; }

 public int Add()
 {
  return FirstNumber + SecondNumber;
 }
}

Tạo mới 1 project MSTest Test Project (.NET Core). Xóa file UnitTest1.cs.
Cài đặt các packages sau:
  • SpecFlow
  • SpecFlow.Tools.MsBuild.Generation
  • SpecRun.SpecFlow
Tạo 2 folers Features và Steps
Nhấp phải folder Features, chọn Add=> Class

File feature mới sẽ có nội dung như sau:

Feature: Calculator
 In order to avoid silly mistakes
 As a math idiot
 I want to be told the sum of two numbers

@mytag
Scenario: Add two numbers
 Given I have entered 50 into the calculator
 And I have entered 70 into the calculator
 When I press add
 Then the result should be 120 on the screen
Bạn cần sửa lại câu phát biểu sau And thành
And I have also entered 70 into the calculator
Nhấp phải vào file Calculator.feature, chọn Generate Step Definitions.
Chọn đường dẫn lưu vào thư mục Steps với tên file: CalculatorSteps.cs

[Binding]
public class CalculatorSteps
{
 private Calculator calculator = new Calculator();
 private int result;

 [Given(@"I have entered (.*) into the calculator")]
 public void GivenIHaveEnteredIntoTheCalculator(int number)
 {
  calculator.FirstNumber = number;            
 }

 [Given(@"I have also entered (.*) into the calculator")]
 public void GivenIHaveAlsoEnteredIntoTheCalculator(int number)
 {
  calculator.SecondNumber = number;
 }

 [When(@"I press add")]
 public void WhenIPressAdd()
 {
  result = calculator.Add();
 }
 
 [Then(@"the result should be (.*) on the screen")]
 public void ThenTheResultShouldBeOnTheScreen(int expectedResult)
 {
  Assert.AreEqual(expectedResult, result);
 }
}

Mở Test Explorer để kiểm tra kết quả.

Link download: https://www.mediafire.com/file/wos3g9e21r57xkz

Link tham khảo:

https://www.toolsqa.com/specflow/step-definition-file/
https://viblo.asia/p/cucumber-co-ban-ngon-ngu-gherkin-jamoG8ndRz8P
 https://www.mediafire.com/file/wos3g9e21r57xkz/SpecFlowTutorial.rar/filehttps://www.mediafire.com/file/wos3g9e21r57xkz/SpecFlowTutorial.rar/filehttps://www.mediafire.com/file/wos3g9e21r57xkz/SpecFlowTutorial.rar/file
Chúc các bạn thành công
Nhatkyhoctap's blog

Comments

Popular posts from this blog

Lập trình đa luồng với Task

Bài viết được đăng trên Jou Lập trình
Trong phiên bản .NET framework 4.0, Microsoft đã bổ sung nhiều thư viện hỗ trợ việc xử lý đa luồng (multi-threading), nhằm đơn giản hóa việc lập trình lẫn hiệu suất của chương trình. Trong bài viết này, tôi xin hướng dẫn các bạn sử dụng lớp System.Threading.Task.

Tìm hiểu về IdentityServer 4

Trong bài viết này, mình sẽ hướng dẫn các bạn làm quen với thư viện Identity Server 4, và tích hợp các service In-Memory của Identity Server 4 vào Project Web API trong .NET Core.

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize
Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh.
Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.