Weitere ähnliche Inhalte Ähnlich wie Test First (20) Kürzlich hochgeladen (20) Test First14. requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test!
!
15. requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
16. requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
17. requirement -> test! <- code!
!
requirement -> test! <- code!
! Refactor!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
18. requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
19. requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
requirement -> test! <- code!
!
25. Merge load more data!
- (void)mergeData:(NSDictionary *)response!
intoStream:(NUSStream *)stream;!
26. Merge load more data!
testMergeData_ShouldUpdateLoadMoreUrl_WhenItExis
tsInTheResponse();!
!
testMergeData_ShouldClearExistingLoadMoreUrl_Whe
nItDoesNotExistInTheResponse();!
!
testMergeData_ShouldMergePYMKInOrder_WhenTheResp
onseHasPYMKData();!
!
testMergeData_ShouldNotCrash_WhenResponseDataHav
eEmptyValues();!
!
!
//edge case!
testMergeData_ShouldNotCrash_WhenResponseDataIsI
nvalid();!
27. Merge load more data!
testMergeData_ShouldUpdateLoadMoreUrl_WhenItExis
tsInTheResponse();!
!
testMergeData_ShouldClearExistingLoadMoreUrl_Whe
nItDoesNotExistInTheResponse();!
!
testMergeData_ShouldMergePYMKInOrder_WhenTheResp
onseHasPYMKData();!
!
testMergeData_ShouldNotCrash_WhenResponseDataHav
eEmptyValues();!
!
!
//edge case!
testMergeData_ShouldNotCrash_WhenResponseDataIsI
nvalid();!
30. Faster feedback!
The code you just wrote isn’t doing
what you think.!
The line you just removed will break
PYMK load more functionality.!
Are you crazy? If you remove that
conditional check, it would break apps
with > 7.0 iOS versions.!
32. Code coverage!
function save(input) {!
if (isValid(input)) {!
if (lixEnabled()) {!
" " logger.info(‘new save’);!
newSave(input);!
} else {!
logger.info(‘old save’);!
if (input.type === ‘x’) {!
oldXSave(input);!
} else {!
oldYSave(input);!
}!
}!
}!
}!
36. Code coverage!
// SaveHelper.js!
function save(input);!
!
!
!
// SaveHelperSpec.js!
testSave_ShouldNotSave_WhenInputIsInvalid();!
testSave_ShouldUseNewAPI_WhenLixEnabled();!
testSave_ShouldUseOldAPI_WhenLixDisabled();!
37. Code coverage!
// SaveHelper.js!
function save(input);!
!
!
// SaveHelperSpec.js!
testSave_ShouldNotSave_WhenInputIsInvalid();!
testSave_ShouldUseNewAPI_WhenLixEnabled();!
testSave_ShouldUseOldAPI_WhenLixDisabled();!
testSave_ShouldUseOldXAPI_WhenInputTypeIsX();!
38. Code coverage!
// SaveHelper.js!
function save(input);!
!
// SaveHelperSpec.js!
testSave_ShouldNotSave_WhenInputIsInvalid();!
testSave_ShouldUseNewAPI_WhenLixEnabled();!
testSave_ShouldUseOldAPI_WhenLixDisabled();!
testSave_ShouldUseOldXAPI_WhenInputTypeIsX();!
testSave_ShouldUseOldYAPI_WhenInputTypeIsY();!
39. Code coverage!
// SaveHelper.js!
function save(input);!
!
// SaveHelperSpec.js!
testSave_ShouldNotSave_WhenInputIsInvalid();!
testSave_ShouldUseNewAPI_WhenLixEnabled();!
testSave_ShouldUseOldAPI_WhenLixDisabled();!
testSave_ShouldUseOldXAPI_WhenInputTypeIsX();!
testSave_ShouldUseOldYAPI_WhenInputTypeIsY();!
40. Effective tests!
Fail when the functionality breaks!
!
KISS!
!
Test functionality, not the
implementation.!
!
Don’t repeat your code in test.!
41. Effective tests!
Fail when the functionality breaks!
// code!
paymentService = util.getPS();!
paymentService.submit();!
!
!
!
!
// unit test assertion!
util.stub(‘getPS’).returns(mockService);!
mockService.expect(‘submit’);!
42. Effective tests!
Fail when the functionality breaks!
// code!
paymentService = util.getPS();!
paymentService.submit();!
!
!
// unit test assertion!
util.stub(‘getPS’).returns(mockService);!
mockService.expect(‘submit’);!
!
forgot to verify!!
43. Effective tests!
Keep It Simple Stupid!
// unit test assertion!
assert(“m_sim2_guided_edit_photo_add_actionsh
eet_camera_tap_use_photo”, result);!
!
" " " " " " "(vs)!
!
assert(metricsRevisionPrefix + pageKey +
widget + actionVerb + name, result);!
44. Effective tests!
Test functionality, not the implementation.!
void addNewRow(row) {!
. . .!
row.setDisplay(“block”);!
row.setPaddingTop(0);!
row.setMargin(0);!
}!
!
!
!
!
unit test type 1!
verify(rowMock).setDisplay(“block”);!
verify(rowMock).setPaddingTop(0);!
Verify(rowMock).setMargin(0);!
45. Effective tests!
Test functionality, not the implementation.!
void addNewRow(row) {!
. . .!
row.setDisplay(“block”);!
row.setPaddingTop(0);!
row.setMargin(0);!
}!
!
unit test type 1!
verify(rowMock).setDisplay(“block”);!
verify(rowMock).setPaddingTop(0);!
Verify(rowMock).setMargin(0);!
!
unit test type 2!
assertTrue(lastRow.bottom === newRow.top);!
46. Effective tests!
Don’t repeat your code in the test!
String getDateForDisplay() {!
Date date = service.loadDate();!
SimpleDateFormat dateFormat !
= newSimpleDateFormat("yyyy-MM-dd z");!
return dateFormat.format(date);!
}!
!
// unit test!
assertEquals(“2014-02-02 PST”, result);!
!
assertEquals(new SimpleDateFormat(“yyyy-MM-dd
z”).format(expectedDate), result);!