Types of tests

Unit Testing

Unit Testing: Analysing a small piece of code is known as Unit Testing. Each unit test targets a unit of code in isolation. Unit testing should be as simple as possible, and it should not be depended on another functions/classes.

Тестваме само отделните методи на даденият клас. При подаване на някакви тестови аргументи, и знаейки какъв резултат трябва да буде върнат, виждаме дали методът работи правилно.

Не се допуска взаимодействие с какъвто и да било storage (DB, files…) както и например HTTP заявки към други компютри. Ако например ни трябва работа с DB, то фейкваме самата връзка за та не се осъществи реално работа с DB.

Всеки тест е напълно независим от останалите.

Functional Testing

Тези тестове имат цел про да симулират потребителското взаимодействие с SUT като например посредством браузър.
„Отвори този URL, събмитни дадена форма, в отговора има ли даден текст…“

Integration Testing

Много близък до Unit test тип, с разликата че работим реално с DB или друг сторидж.

Acceptance Testing

Acceptance Testing: This is the last phase of the testing process. Here we check the behavior of whole application from users side. End users insert the data and check the output whether it meets the required specifications or not. They just check the flow, not the functionality.

Допускат се взаимодействие с storage (DB, files…) както и например HTTP заявки към други компютри. Тестваме цялостното поведение на SUT от позицията на външен поребител.

Литература:

https://www.valuebound.com/resources/blog/understanding-phpunit-and-how-to-write-unit-test-cases

Things every developer absolutely, positively needs to know about database indexing – Kai Sassnowski

SOME Difference Between B-tree and Binary tree

https://www.tutorialspoint.com/difference-between-b-tree-and-binary-tree

Първа разлика: При B-Tree родителският елемент може да има N на брой наследника, а не само 2 като при Binary tree.

Втора разлика: При B-Tree всички последни елементи (листата) са винаги на едно ниво, за разлика от Binary tree. И по този начин при B-Tree за да намерим дадено „листо“ и тръгнем от root елементът, ще ни трябват винаги еднакъв брой стъпки.
И всички „листа“ при B-Tree са сортирани.
И има връзка (т.н. double linked list) между отделните „групички“ (т.н. sets of leafnodes) листа на отделните „родители“, за да не се налага да се връщаме едно ниво нагоре когато търсим, която я няма в даденият set of leafnodes.

Unit tests doubles

Dummy objects are passed around but never actually used. Usually they are just used to fill parameter lists.

Stubs

Просто методите на stubs са хардкоднати да връщат винаги даден предефиниран резултат при различни сценарии. Дори не хвърлят и exceptions или каквото и да е от самата бизнес логика.

A stub provides predetermined responses to calls made during a test. For example, if testing a payment gateway, a stub can simulate both successful and failed transactions, ensuring your code responds appropriately.

Example: Your test class depends on a method Calculate() taking 5 minutes to complete. Rather than wait for 5 minutes you can replace its real implementation with stub that returns hard-coded values; taking only a small fraction of the time.

Or the network connection to twitter API is very slow, which make my test slow. I know it will return timelines, so I made a stub simulating HTTP twitter API, so that my test will run it very fast, and I can running the test even I’m offline.

Mocks

Very similar to Stub but interaction-based rather than state-based. This means you don’t expect from Mock to return some value, but to assume that specific order of method calls are made.
Example: You’re testing a user registration class. After calling Save, it should call SendConfirmationEmail.

Stubs and Mocks are actually sub types of Mock, both swap real implementation with test implementation, but for different, specific reasons.

Stubs don’t fail your tests, mock can.

Stub – for replacing a method with code that returns a specified result.

Mock – a stub with an assertion that the method gets called.

С mock например можеш да провериш дали при дадени сценарии тестваният метод ще хвърли или не exception, дали минава или фейлва например някаква валидация…
Със stub – не, там просто се връща нещо хардкоднато.

Example in JavaScript:

var Stub = {
method_a: function(param_a, param_b){
return 'This is an static result';
}
}

var Mock = {
calls: {
method_a: 0
}

method_a: function(param_a, param_b){
this.method_a++;
console.log('Mock.method_a its been called!');
}
}

Литература:

https://www.bairesdev.com/blog/stub-vs-mock

https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub

https://martinfowler.com/articles/mocksArentStubs.html