noqa directive
دنیای نادیدهگرفته شدنها دنیای عجیبی است. از .gitignore گرفته تا noqa. دایرکتیو noqa اما داستان جداگانهای دارد. معمولا برنامهنویسان از یک استایل گاید مشترک برای برنامهنویسی استفاده میکنند. در پایتون این استایل گاید مشترک pep8 است. کم پیش میاید که پروژهای را خودتان از صفر شروع کنید و معمولا پروژه پیشرو را برنامهنویس دیگری نوشته است و شما احتمالا باید قابلیتهای آن را توسعه دهید یا خطاهای موجود را برطرف نمایید. اینجاست که فوج فوج فحش و ناسزا نثار برنامهنویس قبلی میشود! pep8 و کد استایل گایدها برای کمتر کردن این فحشها ایجاد شدهاند. خیلی ساده است. همه باید(یا بهتر است) استایل مشخصی در کدنویسی داشته باشند. کتابخانههایی برای بررسی کد و درواقع پیدا کردن تکه کدهایی که بر مبنای استایل گاید نیستند، ایجاد شدهاند. اغلب آنها را با عنوان لینتر میشناسیم. یکی از معروفترین این کتابخانهها flake است. حالا موارد بالا چه ربطی به دایرکتیو noqa (No Quality Assurance) #دارد؟
flake با برخورد به کدی که pep8 را رعایت نکرده است، یک warning میدهد. با دایرکتیو noqa# میتوانیم به جناب flake بفهمانیم که رعایت pep8 را در آن کد نادیده بگیرد. به همین سادگی!
# noqa: ERROR
# noqa: F811
دربارهی flake8 و دایرکتیو noqa:
from unittest import TestCase
from fractions import Fraction
from operators.my_sum import sum
class TestSum(TestCase):
def test_can_sum_list_of_integers(self):
# fixture(Input)
data = [1, 2, 3]
# exec with fixture(Execute)
result = sum(data)
# evalute result with expected result(Assert)
self.assertEqual(result, 6)
def test_can_sum_tuple_of_integers(self):
data = (1, 2, 3)
result = sum(data)
self.assertEqual(result, 6)
def test_can_sum_list_of_fractions(self):
data = [
Fraction(1, 4),
Fraction(1, 4),
Fraction(2, 4),
]
result = sum(data)
self.assertEqual(result, 1)
def test_can_not_sum_bad_types(self):
data = 'banana'
with self.assertRaises(TypeError):
result = sum(data) # noqa: F841
def test_can_sum_single_numbers(self):
num1, num2 = 1, 2
with self.assertRaises(TypeError):
result = sum(num1, num2) # noqa: F841
def test_can_sum_set_of_integers(self):
data = {1, 2, 3}
result = sum(data)
self.assertEqual(result, 6)
def test_can_sum_set_on_integers_with_repetition(self):
data = {1, 2, 2}
result = sum(data)
self.assertEqual(result, 3)
def test_can_sum_list_of_floats(self):
data = [1.1, 2.1, 3.5]
result = sum(data)
self.assertEqual(result, 6.7)
# data === Fixture
# multiple Fixture -> Same Result -> Parametrizetion
# Side Effects? > srp, mock, integeration test
# Test MUST be repeatable!
# test runner
# tox -> run tests on multiple envs
# ci/cd -> automating executation of tests(Travis CI/Jenkins)
# linter -> flake8
flake8 test.py