ਮੇਰਾ CI/CD Pipeline 3 ਮਹੀਨਿਆਂ ਤੱਕ ਪਾਸ ਹੋਇਆ — ਫਿਰ ਮੈਂ ਲੌਗਸ (logs) ਪੜ੍ਹੇ
ਹਰੇ ਚੈੱਕਮਾਰਕਸ ਵਧੀਆ ਲੱਗਦੇ ਹਨ। ਹਰ pull request ਪਾਸ ਹੋ ਗਈ। ਹਰ deploy ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ।
ਫਿਰ ਇੱਕ ਯੂਜ਼ਰ ਨੇ ਇੱਕ ਖਰਾਬ ਫੀਚਰ ਦੀ ਰਿਪੋਰਟ ਕੀਤੀ। ਇਹ ਹਫ਼ਤਿਆਂ ਤੋਂ ਖਰਾਬ ਸੀ।
ਮੈਂ ਪਾਈਪਲਾਈਨ ਲੌਗਸ ਖੋਲ੍ਹੇ। ਸਾਡੀਆਂ ਪਾਸ ਹੋ ਰਹੀਆਂ ਬਿਲਡਸ ਨੇ ਸਾਡੇ ਨਾਲ ਝੂਠ ਬੋਲਿਆ।
ਸਾਡੀ ਪ੍ਰਕਿਰਿਆ ਬਿਲਕੁਲ ਸਹੀ ਲੱਗ ਰਹੀ ਸੀ:
- Linting
- Unit tests
- Integration tests
- Build
- Deploy
ਹਰ ਕਦਮ ਦੀ ਸਫਲਤਾ ਦਰ ਮਹੀਨਿਆਂ ਤੋਂ 100% ਸੀ।
ਕਲਿੱਕ ਕਰਨ 'ਤੇ export ਬਟਨ ਨੇ ਕੁਝ ਨਹੀਂ ਕੀਤਾ। ਕੋਈ error ਨਹੀਂ ਆਇਆ। ਮੈਂ ਇਸ ਦਾ ਪਤਾ 11 ਹਫ਼ਤੇ ਪਹਿਲਾਂ ਕੀਤੇ ਗਏ ਇੱਕ ਬਦਲਾਅ ਤੋਂ ਲਗਾਇਆ। ਪਾਈਪਲਾਈਨ ਪਾਸ ਹੋ ਗਈ ਸੀ। Code review ਨੂੰ ਮਨਜ਼ੂਰੀ ਮਿਲ ਗਈ ਸੀ। ਫੀਚਰ ਸ਼ੁਰੂ ਤੋਂ ਹੀ ਖਰਾਬ ਸੀ।
ਸਮੱਸਿਆ ਸਾਡਾ ਕੋਡ ਨਹੀਂ ਸੀ। ਇਹ ਸਾਡਾ test ਕੋਡ ਸੀ।
ਸਾਡੇ integration tests ਹਰ ਚੀਜ਼ ਲਈ mocks ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਸਨ। ਅਸੀਂ ਪੂਰੀ export service ਨੂੰ mock ਕਰ ਦਿੱਤਾ ਸੀ। ਟੈਸਟ ਨੇ ਅਸਲੀ ਕੋਡ ਦੀ ਬਜਾਏ mock ਦੀ ਜਾਂਚ ਕੀਤੀ। Mock ਹਮੇਸ਼ਾ success status ਵਾਪਸ ਕਰਦਾ ਸੀ।
ਅਸੀਂ over-mocking ਦੇ ਜਾਲ ਵਿੱਚ ਫਸ ਗਏ:
- Unit tests: ਯੂਨਿਟ ਨੂੰ ਅਲੱਗ ਕਰਨ ਲਈ ਸਭ ਕੁਝ mock ਕੀਤਾ ਗਿਆ। ਇਹ ਠੀਕ ਹੈ।
- Integration tests: ਰਫ਼ਤਾਰ ਲਈ ਸਭ ਕੁਝ mock ਕੀਤਾ ਗਿਆ। ਇਹ ਇੱਕ ਗਲਤੀ ਹੈ।
- E2E tests: ਇਸ ਖਾਸ flow ਨੂੰ ਮਿਸ ਕਰ ਦਿੱਤਾ।
ਸਾਡੇ integration tests ਸਿਰਫ਼ ਮਹਿੰਗੇ unit tests ਸਨ। ਉਹਨਾਂ ਨੇ ਸਿਰਫ਼ ਇਹ ਪੁਸ਼ਟੀ ਕੀਤੀ ਕਿ ਸਾਡੇ mocks ਕੰਮ ਕਰ ਰਹੇ ਸਨ। ਉਹਨਾਂ ਨੇ ਇਹ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਕਿ ਸਾਡਾ ਕੋਡ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ।
ਮੈਂ ਇਸ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਤਿੰਨ ਬਦਲਾਅ ਕੀਤੇ:
Mocks ਨੂੰ unit tests ਤੱਕ ਸੀਮਤ ਰੱਖੋ। Integration tests ਨੂੰ ਅਸਲੀ databases, APIs, ਅਤੇ file systems ਨਾਲ ਜੁੜਨਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਕੋਈ ਟੈਸਟ ਹੌਲੀ ਹੈ, ਤਾਂ ਉਸਨੂੰ mock ਨਾਲ ਨਾ ਛੁਪਾਓ। ਉਸ ਰਫ਼ਤਾਰ ਨੂੰ optimize ਕਰਨ ਦੇ ਸੰਕੇਤ ਵਜੋਂ ਵਰਤੋ।
Contract tests ਜੋੜੋ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਨ ਕਿ ਤੁਹਾਡੇ mocks ਅਸਲੀ service behavior ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਹਨ। ਜੇਕਰ ਕੋਈ mock ਅਜਿਹਾ ਡੇਟਾ ਵਾਪਸ ਕਰਦਾ ਹੈ ਜੋ ਅਸਲੀ service ਨਹੀਂ ਕਰੇਗੀ, ਤਾਂ contract test ਫੇਲ ਹੋ ਜਾਂਦਾ ਹੈ।
ਅਸਲੀ coverage ਨੂੰ ਟ੍ਰੈਕ ਕਰੋ। ਅਸੀਂ ਸਿਰਫ਼ pass rates ਦੇਖਣਾ ਬੰਦ ਕਰ ਦਿੱਤਾ। ਅਸੀਂ ਇਹ ਦੇਖਿਆ ਕਿ ਟੈਸਟਾਂ ਨੇ ਅਸਲ ਵਿੱਚ ਕੀ ਚਲਾਇਆ। ਸਾਡੇ coverage ਦੇ ਅੰਕੜੇ 94% ਤੋਂ ਡਿੱਗ ਕੇ 67% ਰਹਿ ਗਏ। ਇਹ ਸਾਡੇ ਕੋਲ ਸਭ ਤੋਂ ਇਮਾਨਦਾਰ metric ਸੀ।
ਇੱਕ ਹਰੀ (green) ਪਾਈਪਲਾਈਨ ਦਾ ਮਤਲਬ ਇਹ ਨਹੀਂ ਹੈ ਕਿ ਤੁਹਾਡਾ ਕੋਡ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਡੇ ਟੈਸਟ ਪਾਸ ਹੋ ਗਏ ਹਨ। ਇਹ ਦੋ ਵੱਖ-ਵੱਖ ਚੀਜ਼ਾਂ ਹਨ।
ਸਭ ਤੋਂ ਖ਼ਤਰਨਾਕ bugs ਉਹ ਹੁੰਦੇ ਹਨ ਜਿਨ੍ਹਾਂ ਬਾਰੇ ਤੁਹਾਡੀ ਪਾਈਪਲਾਈਨ ਕਹਿੰਦੀ ਹੈ ਕਿ ਉਹ ਠੀਕ ਹਨ।
ਆਪਣੇ ਆਪ ਨੂੰ ਇਹ ਸਵਾਲ ਪੁੱਛੋ:
- ਕੀ ਮੇਰੇ ਟੈਸਟ bugs ਫੜ ਰਹੇ ਹਨ ਜਾਂ ਸਿਰਫ਼ mocks ਦੀ ਪੁਸ਼ਟੀ ਕਰ ਰਹੇ ਹਨ?
- ਕੀ ਮੇਰੇ integration tests ਅਸਲ ਵਿੱਚ integrate ਕਰਦੇ ਹਨ?
- ਜੇਕਰ ਮੈਂ ਸਾਰੇ mocks ਹਟਾ ਦਵਾਂ, ਤਾਂ ਕਿੰਨੇ ਟੈਸਟ ਅਜੇ ਵੀ ਪਾਸ ਹੁੰਦੇ ਹਨ?
- ਕੀ ਮੈਂ coverage ਨੂੰ ਮਾਪ ਰਿਹਾ ਹਾਂ ਜਾਂ confidence ਨੂੰ?
ਇੱਕ ਪਾਈਪਲਾਈਨ ਜੋ ਕਦੇ ਫੇਲ ਨਹੀਂ ਹੁੰਦੀ, ਉਹ ਭਰੋਸੇਯੋਗ ਨਹੀਂ ਹੈ। ਇਹ untested ਹੈ।
Source: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
