সিস্টেম টেস্ট বলতে এসডিভি টেস্ট ফ্রেমওয়ার্ক ব্যবহার করে তৈরি করা যেকোনো এসডিভি টেস্টকে বোঝায়।
টেস্ট তৈরি
পরীক্ষার স্থান
-
<test_repository_root>/sample_tests -
<test_repository_root>/e2e_tests -
<test_repository_root>/long_running_tests -
<test_repository_root>/performance_tests -
<test_repository_root>/hardware
পরীক্ষার ফাইল
README.md: সকল টেস্টে অবশ্যই টেস্টটির উদ্দেশ্য এবং এটি কীভাবে চালাতে হবে তার বিবরণ অন্তর্ভুক্ত থাকতে হবে।টেস্ট ফাইল: সকল টেস্ট একই ধরনের কাঠামো অনুসরণ করে:
"""SDV Name Test"""
from sdv_test_fw.test_execution import sdv_base_test, sdv_test_runner
class SdvTypeNameTest(sdv_base_test.SdvBaseTestClass):
def setup_class(self):
# Setup code. Executed only once at the beginning of the test.
super().setup_class()
self.sdv_device1 = self.get_device('device1')
self.sdv_device2 = self.get_device('device2')
...
# Remove if not needed.
def setup_test(self):
super().setup_test()
# Setup code. Executed before every test case.
# Remove override if not needed.
# Remove if not needed.
def teardown_test(self):
# Cleanup code. Executed after every test case.
super().teardown_test()
# Remove if not needed.
def teardown_class(self):
# Cleanup code. Executed once at the end of the test.
super().teardown_class()
def test_name_case1(self):
# Test case step
# Test case verification
def test_name_case2(self):
# Test case step
# Test case verification
if __name__ == '__main__':
# Start Test Execution Using SDV Test Framework
sdv_test_runner.run()
- বিল্ড ফাইল:
Android.bp। ফাইল কাঠামোটি নিম্নরূপ:
python_test_host {
name: "SdvTypeNameTest", // Should match the name of the test class.
main: "sdv_type_name_test.py",
srcs: [
"sdv_type_name_test.py",
],
data: [
":sdv_test_fw_device_configs",
],
test_options: {
unit_test: false,
},
defaults: [
"sdv_test_fw_defaults",
],
test_config_template: ":<DEFAULT_TEMPLATE_NAME>",
}
নামকরণের রীতি
বিভিন্ন ধরণের পরীক্ষা শনাক্ত ও খুঁজে বের করার জন্য, একটি নির্দিষ্ট নামকরণ রীতি অনুসরণ করে পরীক্ষাগুলো তৈরি করতে হবে।
নমুনা পরীক্ষা
ফাইলের নাম:
sdv_sample_<NAME>_test.pyক্লাসের নাম:
SdvSampleNameTest
E2E পরীক্ষা
ফাইলের নাম:
sdv_e2e_<NAME>_test.pyক্লাসের নাম:
SdvE2ENameTest
দীর্ঘস্থায়ী পরীক্ষা
ফাইলের নাম:
sdv_long_running_<NAME>_test.pyক্লাসের নাম:
SdvLongRunningNameTest
কর্মক্ষমতা পরীক্ষা
ফাইলের নাম:
sdv_performance_<NAME>_test.pyক্লাসের নাম:
SdvPerformanceNameTest
হার্ডওয়্যার পরীক্ষা
ফাইলের নাম:
sdv_hw_<NAME>_test.pyক্লাসের নাম:
SdvHWNameTest
কোড নির্দেশিকা
এই বিভাগে এসডিভি সিস্টেম টেস্ট লেখার জন্য নির্দেশিকা এবং সর্বোত্তম অনুশীলনসমূহ প্রদান করা হয়েছে।
পাইথন এবং মোবাইল
পাইথন স্টাইল গাইড এবং মব্লি বেস্ট প্র্যাকটিসেস সম্পর্কে ভালোভাবে জেনে নিন, এবং নিম্নলিখিত SDV-নির্দিষ্ট সুপারিশগুলো বিবেচনা করুন:
অ্যাসারশন ছাড়া সরাসরি মব্লি ইম্পোর্ট ব্যবহার করা এড়িয়ে চলুন। এসডিভি টেস্ট ফ্রেমওয়ার্কটি এসডিভি-কে কেন্দ্র করে এর উপর ভিত্তি করে নির্মিত হয়েছে।
অ্যাসারশন: সরাসরি মোবাইল অ্যাসারশন ব্যবহার করুন।
এসডিভি পরীক্ষা
নিম্নলিখিত বিভাগগুলিতে এসডিভি টেস্ট ফ্রেমওয়ার্কের আওতায় টেস্ট তৈরির জন্য নির্দিষ্ট নির্দেশিকা এবং সর্বোত্তম অনুশীলনসমূহ তুলে ধরা হয়েছে।
সেটআপ এবং পরিষ্কার করা
সেটআপ এবং ক্লিনআপ কোড অবশ্যই টেস্ট কেসের বাইরে থাকতে হবে। টেস্ট ব্যর্থ হলেও, ডিভাইসের যথাযথ ক্লিনআপ করার জন্য টিয়ারডাউন মেথডগুলো কল করা হয়।
সেটআপ এবং টিয়ারডাউন কোডের অবস্থান পরীক্ষার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে, এমনকি পরীক্ষাটি বাধাগ্রস্ত হলেও:
- সম্পূর্ণ টেস্টের শুরুতে এবং শেষে শুধু একবার চালানোর জন্য
setup_classএবংteardown_classব্যবহার করুন। উদাহরণস্বরূপ, ডিভাইসগুলি সংগ্রহ করা, ভেরিয়েবলের মান বা এমন স্টেট সেট করা যা টেস্ট কেসগুলির মধ্যে পরিবর্তিত হয় না, ডিভাইসের সাধারণ বৈশিষ্ট্যগুলি কনফিগার করা, বা ফ্ল্যাগ সেট করা।
def setup_class(self):
super().setup_class()
# setup code
def teardown_class(self):
# teardown code
super().teardown_class()
- টেস্ট কেসগুলোর মাঝে, অর্থাৎ প্রতিটির আগে ও পরে চালানোর জন্য। উদাহরণস্বরূপ, একটি ইন্টারেক্টিভ সেশন বা সাধারণ সার্ভিস এক্সিকিউশন।
def setup_test(self):
super().setup_test()
# setup code
def teardown_test(self):
# teardown code
super().teardown_test()
প্যারামিটারাইজড টেস্ট কেস
কোডের পুনরাবৃত্তি এড়াতে, বিভিন্ন টেস্ট কেসের ধাপগুলো একই হলে প্যারামিটারাইজড টেস্ট কেস ব্যবহার করুন।
from absl.testing import parameterized
@parameterized.named_parameters(
{
'testcase_name': 'ab',
'input1': 'a',
'input2': 'b',
},
{
'testcase_name': 'cd',
'input1': 'c',
'input2': 'd',
},
)
def test_name(self, input1, input2):
# test
এই উদাহরণটি test_name_ab এবং test_name_cd দুটি টেস্ট কেস তৈরি করে।
আচরণ যাচাইয়ের জন্য একটি টেস্ট কেস
টেস্ট কেসগুলো সংক্ষিপ্ত হওয়া উচিত এবং একটি নির্দিষ্ট আচরণের উপর কেন্দ্র করে তৈরি হওয়া উচিত। যদি একাধিক আচরণের মধ্যে সাধারণ পূর্বশর্ত বা ধাপ থাকে, তবে সেগুলোকে বিভক্ত করার কথা বিবেচনা করুন। পুনরাবৃত্তিমূলক কোডের পরিমাণ কমাতে আপনি setup_test বা প্যারামিটারাইজেশন ব্যবহার করতে পারেন।
এই পদ্ধতি অনুসরণ করলে টেস্টগুলো পড়া ও ডিবাগ করা সহজ হয়, কারণ এতে স্পষ্টভাবে বোঝা যায় কোন ধাপ ও শর্তগুলো ব্যর্থ হয়েছে।
উদাহরণ
test_verify_process():
device.start_process()
# precondition 1
device.send_signal1()
# verification signal1 received
...
# precondition 2
device.send_signal2()
# verification signal2 received
...
# precondition 3
device.start_agent()
# verification behavior
...
device.kill_process()
test_setup_test():
super().setup_test()
device.start_process()
test_signal1():
# precondition
device.send_signal1()
# verification signal1 received
...
test_signal2():
# precondition
device.send_signal2()
# verification signal2 received
...
test_agent():
# precondition
device.start_agent()
# verification behavior
...
teardown_test():
device.kill_process()
super().teardown_test()
নির্ণয়মূলক পরীক্ষার আচরণ
টেস্টে এমন শর্ত যোগ করা এড়িয়ে চলুন যা এর আচরণকে বিভক্ত করে। যদি কোনো যাচাইকরণকে বিভক্ত করার প্রয়োজন হয়, তাহলে তার পরিবর্তে দুটি ভিন্ন টেস্ট কেস ব্যবহার করুন।
ব্যতিক্রম ব্যবহার করবেন না
টেস্ট এবং সাধারণ হেল্পারগুলোতে এক্সেপশনের পরিবর্তে অ্যাসারশন ব্যবহার করতে হবে। এটি ডিবাগিং সহজ করে এবং টেস্টিং প্যাটার্ন অনুসরণ করে।
উদাহরণ
result = self.some_calculations()
if result is None:
raise Exception("No result")
result = self.some_calculations()
self.get_test_validator().assert_is_not_none(result)
উদাহরণ
if not self.device.is_subprocess_running(
self.EXPECTED_PROCESS
):
raise Exception("Process is not running")
self.get_test_validator().assert_true(
self.device.is_subprocess_running(self.EXPECTED_PROCESS),
"Process is not running"
)
ঘুম ব্যবহার করবেন না
sleep ব্যবহার করা পরিহার করুন, কারণ এটি টেস্ট সম্পাদনের সময় বাড়িয়ে দেয় এবং ফ্ল্যাকিনেস সৃষ্টি করে।
যখন পরীক্ষাটি চালিয়ে যাওয়ার জন্য কোনো ঘটনা বা যাচাইকরণের জন্য অপেক্ষা করার প্রয়োজন হয়, তখন এর পরিবর্তে ফ্রেমওয়ার্কে প্রদত্ত ওয়েটিং মেথডগুলো ব্যবহার করুন।
ওয়েটিং মেথডগুলো সাবধানে ব্যবহার করুন, কারণ শর্তটি পূরণ না হওয়া পর্যন্ত বা টাইমআউট শেষ না হওয়া পর্যন্ত টেস্ট এক্সিকিউশন আটকে থাকে।
পরীক্ষায় কোনো শর্ত পূরণ হওয়ার জন্য অপেক্ষা করতে হলে, নিম্নলিখিত প্রশ্নগুলো জিজ্ঞাসা করুন:
একটি যুক্তিসঙ্গত টাইমআউট কী?
যদি একটি নির্দিষ্ট সময়সীমার মধ্যে কোনো ঘটনা ঘটার সম্ভাবনা থাকে, তবে টেস্টটি দ্রুত ব্যর্থ হয় তা নিশ্চিত করার জন্য টাইমআউটটি সেই প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। প্রয়োজনে টাইমআউট কমিয়ে দিন (ডিফল্ট হলো ৩০ সেকেন্ড)।
অপেক্ষা পদ্ধতিতে সম্পাদিত অপারেশনটি কতটা ব্যয়বহুল?
ব্যয়বহুল অপারেশনগুলো ঘন ঘন কল করা থেকে বিরত থাকুন। প্রয়োজনে পোল ব্যবধান বাড়ান (ডিফল্ট হলো ০.৫ সেকেন্ড)।
প্রয়োজনীয়তা সহ টেস্ট কেস
যদি কোনো টেস্টের এমন টেস্ট কেস থাকে যেগুলোর কাজ করার জন্য সুস্পষ্ট শর্তাবলী (যেমন, এটি কোথায় রান করবে) উল্লেখ করা থাকে, এবং সেগুলো সেই শর্তাবলীর সাথে না মেলে, তাহলে আপনি সেগুলোকে স্কিপ করতে পারেন:
def test_with_requirement():
self.get_test_validator().skip_if(expr, reason)
# Test case