Unit-test Android và mặt trái của con số % coverage

Unit-test là cụm từ chúng ta rất rất thường xuyên nghe tới, nhất là những dự án làm web ruby, php... chứ Android thì nghe đến rất ít. Nhưng thực sự làm việc với unit-test thì lại chỉ xuất hiện ở những công ty làm product thôi. Vậy unit-test là gì? Nó có quan trọng không? (Đứng ở khía cạnh lập trình android - outsourcing)

Unit-test là gì?

unit test có nghĩa là kiểm thử (kiểm tra ở phía user) ở mức đơn vị nhỏ nhất (phía lập trình viên) như class, method, property...

unit-test trong android bao gồm junit-test, android instrument test, integration test theo chuẩn TDD

unit test không phải là tìm bug (hay một số code-reviwer đang bị team của mình hiểu nhầm là bới lá tìm bọ) mà unit test là để nhằm hạn chế tối đa các bug khi xây dựng sản phẩm

1. junit test

Junit test hay java-unit test có nghĩa là kiểm thử các đơn vị unit mà chỉ cần trình compile java thôi không cần build thành apk android. Điều này có nghĩa là chỉ cần máy tính của bạn có cài đặt Java SDK là bạn có thể viết junit test được. Junit test nghĩa là code test java đơn thuần (không chứa native android)

Vậy muốn test được trên ứng dụng Android thì chúng ta cần 1 công cụ để hỗ trợ việc này đó là Mockito (hoặc RoboElectric....) 1 framework giúp tạo các object giả Android để quá trình test chạy được hoàn hảo mà không bị các lỗi với java compiler

2. android instrument test

Sau khi junit test được viết, lạp trình viên bắt đầu code dự án và khi đó chúng ta muốn kiểm tra xem ứng dụng của chúng ta hoạt động như thế nào thì chúng ta cần chạy 1 bài test trên nền UI android. Điều này có nghĩa là để chạy được android instrument test thì bạn bắt buộc cần có emulator hoặc device thực để kiểm tra chúng

3. integaration test

Về bản chất thì đây chính là instrument test nhưng để móc nối các thành phần trong ứng dụng của bạn. Như bạn muốn test xem service hoạt động như nào, giá trị trả về được hiển thị trên UI như nào Với case1 thì show thông báo gì, case 2 thì làm gì... Và thư viện được sử dụng cho integration test là Espresso

Unit-test có quan trọng không?

Mình có 1 câu trả lời hóm hỉnh để bạn tự nghiệm câu trả lời của riêng mình nhé

https://stackoverflow.com/a/69263

Unit testing is a lot like going to the gym. You know it is good for you, all the arguments make sense, so you start working out. There's an initial rush, which is great, but after a few days you start to wonder if it is worth the trouble. You're taking an hour out of your day to change your clothes and run on a hamster wheel and you're not sure you're really gaining anything other than sore legs and arms.

Then, after maybe one or two weeks, just as the soreness is going away, a Big Deadline begins approaching. You need to spend every waking hour trying to get "useful" work done, so you cut out extraneous stuff, like going to the gym. You fall out of the habit, and by the time Big Deadline is over, you're back to square one. If you manage to make it back to the gym at all, you feel just as sore as you were the first time you went.

You do some reading, to see if you're doing something wrong. You begin feel a little bit of irrational spite toward all the fit, happy people extolling the virtues of exercise. You realize that you don't have a lot in common. They don't have to drive 15 minutes out of the way to go to the gym; there is one in their building. They don't have to argue with anybody about the benefits of exercise; it is just something everybody does and accepts as important. When a Big Deadline approaches, they aren't told that exercise is unnecessary any more than your boss would ask you to stop eating.

So, to answer your question, Unit Testing is usually worth the effort, but the amount of effort required isn't going to be the same for everybody. Unit Testing may require an enormous amount of effort if you are dealing with spaghetti code base in a company that doesn't actually value code quality. (A lot of managers will sing Unit Testing's praises, but that doesn't mean they will stick up for it when it matters.)

Tạm dịch:

Unit-testing khá giống với việc tập gym. Bạn biết rằng nó tốt cho sức khỏe, bạn không quan tâm đến những lời phản đối việc tập gym và bắt đầu tập luyện. Ban đầu thì nó khá là thú vị nhưng sau vài ngày ( thậm chí ngay sau buổi tập đầu tiên) bạn bắt đầu nghi ngờ liệu việc này có thực sự đem lợi ích không. Bạn phải bỏ 1 giờ để thay quần áo, và chạy trên máy tập chạy và bạn không chắc mình nhận được gì tốt ngoài việc đau ê ẩm chân tay. Sau đó một hoặc vài tuần, các cơ của bạn đã quen với sự vận động và bạn không còn thấy đau nữa, nhưng công việc của bạn lại sắp sửa đến hạn hoàn thành rồi (deadline). Bạn cần nhiều thời gian cho công việc để hoàn thành và nghĩ đến việc cắt bỏ một số hoặc động không cần thiết, như việc tập gym chẳng hạn. Như vậy bạn đã đánh mất thói quen tập luyện vì deadline. Sau khi công việc đi qua cơ thể bạn trở lại như cũ. Và bạn lại quay lại phòng tập gym, bạn sẽ lại ê ẩm toàn thân giống như lần mới đi tập vậy. Bạn tìm hiểu xem bạn đã làm sai ở điểm nào. Bạn cố gắng tìm những điểm chung với họ, những người mà cho rằng tập gym là tốt cho sức khỏe. Và bạn chợt nhận ra rằng bạn không có nhiều điểm chung với những người này. Họ không phải lái xe 15ph để đi đến phòng tập vì phòng tập gần ngay khu họ sống rồi. Họ không phải tranh luận với bất kỳ ai về lợi ích của việc tập gym, mà họ tự nhận thức nó quan trọng và tập thôi. Và khi có deadline công việc họ không bị sếp hối thúc. Do vậy để trả lời câu hỏi này, thì unit testing chính là giá trị những nỗ lực của bạn. Và giá trị này thì không giống nhau với mỗi người. Unit testing có thể đòi hỏi nhiều công sức hơn nếu bạn đang làm trong một công ty mà giá trị của nó không được đánh giá cao. (Rất nhiều nhà quản lý ca tụng Unit-test nhưng điều đó không có nghĩa là họ sẽ chấp nhận nó khi xảy ra sự cố) (Phần lớn các cty outsourcing ở Việt Nam đều không yêu cầu unit-test đối với native development như ios, android)

Test coverage có ý nghĩa như thế nào?

source: https://medium.com/android-testing-daily/code-coverage-dc1e3d0c70

Theo bạn con số % coverage quan trọng không? và có nhất thiết phải bắt buộc >= 80% coverage, hay thậm chí là 100%

Trong android studio đã cung cấp sẵn cho bạn một phương thức test covergare.

Theo như 1 đoạn tweet bên dưới

thì mục tiêu và thành công của dự án quan trọng hơn là 100% coverage. Và con số này còn nguy hiểm hơn nữa khi nó bị biến thành trò chơi.

Coverage 100% những dòng cần test không giống với 100% của toàn bộ code dự án. Theo Pareto thì lợi ích cái nào hơn 100% hay 80% coverage? Cuối cùng theo những dẫn chứng thực tế về TDD thì 100% dường như là vô dụng trong quá trình phát triển nếu developer vi phạm nguyên tắc phát triển các chức năng, các bug được sửa trước khi họ viết code test.

Vậy các bạn đừng tự hào rằng project của tôi được cover 100% nhé. Có thể tốn effort gấp đôi gấp 3 mà chẳng ý nghĩa gì khi develop implement luôn assert TRUE =))

Hãy để unit-testing mang ý nghĩa thực của nó. Hẹn gặp lại các bạn trong buổi seminar unit-testing ở Framgia trong time sắp tới :v