আমি কি অ্যান্ড্রয়েড ডিভাইসে দৃsert়তা ব্যবহার করতে পারি?


88

আমি ব্যবহার করতে চান জাহির পরীক্ষা চলাকালে এমুলেটর, বা আমার ডিভাইসে কিছু ক্ষেত্রে আমার অ্যাপ্লিকেশানের ধ্বংস করতে আমার Android অ্যাপ্লিকেশানে শব্দ। এটা কি সম্ভব?

দেখে মনে হচ্ছে যে এমুলেটরটি কেবল আমার দাবী উপেক্ষা করে।


4
শিল্প জন্য, বরং Dalvik চেয়ে দেখুন stackoverflow.com/questions/35997703/...
fadden

4
নোট করুন যে গৃহীত উত্তরটি বেশ বিভ্রান্তিকর।
ক্রিয়াকলাপ হ্রাস

উত্তর:


-7

এপিআই JUnit সংস্থান সরবরাহ করে ।

আপনি করতে পারেন

import static junit.framework.Assert.*;

এখন আপনি অ্যাসেটট্রু, অ্যাসেটএকুয়ালস, অ্যাসেটনুল যা জুনিট ফ্রেমওয়ার্কে প্রদত্ত সমস্ত ফাংশন ব্যবহার করতে পারেন।

অ্যালিপসের মাধ্যমে জুনিট 4 কাঠামো আমদানি না করার বিষয়ে সতর্ক থাকুন, এটি org.junit প্যাকেজ হবে। এন্ড্রয়েড ডিভাইস বা এমুলেটরটিতে কাজ করার জন্য আপনাকে জুনিট.ফ্রেমওয়ার্ক প্যাকেজটি ব্যবহার করতে হবে।


51
ঠিক আছে ওপি "কিওয়ার্ড দাবী করার জন্য" বলেছিল - যা জুনিট.ফ্রেমওয়ার্কের মত নয় sসেটটি জেআইটি কর্তৃক অনুকূলিত হতে পারে। এবং এই কারণেই আমি এখানে এসেছি। আশা করি অন্য কয়েকটি উত্তর আরও সহায়ক হবে।
মার্টিন

27
আমি অভদ্র হতে ঘৃণা করি তবে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ এটি প্রশ্নের উত্তর দেয় না (আমি @ মার্টিনের মন্তব্যে একমত) অন্যান্য উত্তরগুলি কীভাবে কীভাবে কীওয়ার্ড কার্যকারিতাটি যথাযথভাবে করা যায় তা বোঝায়, যেমন "অ্যাডবি শেল সেটপ্রপ ডিবাগ.সেসার্ট 1"
চালান

4
ডাউনভোটেড কারণ ওপি আসক্তি কীওয়ার্ড সম্পর্কে জিজ্ঞাসা করেছিল। @scorpiodawg নিচে প্রক্রিয়া রূপরেখা জানিয়েছেন: stackoverflow.com/a/5563637/484261

সর্পডায়োডগের উত্তরটি কেবল এক বছর পরে এসেছিল, সুতরাং আমি অনুমান করি যে এই উত্তরটি কেবলমাত্র গ্রহণ করা হয়েছিল কারণ কোনও কারণেই, ওপি কোনও উত্তর স্বীকৃত হিসাবে চিহ্নিত করতে বাধ্য হয়েছিল। এই মনোভাবটি অসম্পূর্ণ বা সম্পূর্ণ ভয়াবহরূপে এসও-তে প্রচুর উত্তর দেয়।
async

145

এম্বেড করা ভিএম কন্ট্রোল ডকুমেন্টটি দেখুন ( উত্স ট্রি থেকে কাঁচা এইচটিএমএল বা একটি সুন্দর বিন্যাসিত অনুলিপি)।

মূলত, ডালভিক ভিএম পূর্বনির্ধারিত অনুসারে চেকগুলি অগ্রাহ্য করতে প্রস্তুত, যদিও .ডেক্স বাইট কোডটিতে চেকটি সম্পাদনের জন্য কোড অন্তর্ভুক্ত থাকে। জরিপগুলি চেক করা দুটি উপায়ের একটিতে চালু করা হয়েছে:

(1) এর মাধ্যমে সিস্টেমের সম্পত্তি "ডিবাগ.সেসার্ট" সেট করে:

adb shell setprop debug.assert 1

যা আমি যাচাই করেছি যতক্ষণ না আপনি এটি করার পরে আপনার অ্যাপ্লিকেশনটি পুনরায় ইনস্টল করবেন ততক্ষণ উদ্দেশ্য হিসাবে কাজ করে বা

(২) ডালভিক ভিএম-তে কমান্ড লাইন আর্গুমেন্ট "- সক্ষম-জোর" প্রেরণ করে যা অ্যাপ ডেভেলপাররা করতে সক্ষম হবেন সম্ভবত (কেউ যদি আমাকে এখানে ভুল হয় তবে আমাকে সংশোধন করে)।

মূলত, এমন একটি পতাকা রয়েছে যা বিশ্বব্যাপী, প্যাকেজ স্তরে বা একটি শ্রেণির স্তরে সেট করা যেতে পারে যা সংশ্লিষ্ট স্তরে দৃser়তা সক্ষম করে। পতাকাটি ডিফল্টরূপে বন্ধ থাকে যার ফলস্বরূপ দৃser় চেকগুলি এড়িয়ে যায়।

আমি আমার নমুনা ক্রিয়াকলাপে নিম্নলিখিত কোডটি লিখেছি:


public class AssertActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    int x = 2 + 3;
    assert x == 4;
  }
}

এই কোডের জন্য, ডালভিক বাইট কোড উত্পন্ন হয় যা হ'ল (অ্যান্ড্রয়েড 2.3.3 এর জন্য):


// Static constructor for the class
000318:                                        |[000318] com.example.asserttest.AssertActivity.:()V
000328: 1c00 0300                              |0000: const-class v0, Lcom/example/asserttest/AssertActivity; // class@0003
00032c: 6e10 0c00 0000                         |0002: invoke-virtual {v0}, Ljava/lang/Class;.desiredAssertionStatus:()Z // method@000c
000332: 0a00                                   |0005: move-result v0
000334: 3900 0600                              |0006: if-nez v0, 000c // +0006
000338: 1210                                   |0008: const/4 v0, #int 1 // #1
00033a: 6a00 0000                              |0009: sput-boolean v0, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000
00033e: 0e00                                   |000b: return-void
000340: 1200                                   |000c: const/4 v0, #int 0 // #0
000342: 28fc                                   |000d: goto 0009 // -0004

: :

// onCreate() 00035c: |[00035c] com.example.asserttest.AssertActivity.onCreate:(Landroid/os/Bundle;)V 00036c: 6f20 0100 3200 |0000: invoke-super {v2, v3}, Landroid/app/Activity;.onCreate:(Landroid/os/Bundle;)V // method@0001 000372: 1501 037f |0003: const/high16 v1, #int 2130903040 // #7f03 000376: 6e20 0500 1200 |0005: invoke-virtual {v2, v1}, Lcom/example/asserttest/AssertActivity;.setContentView:(I)V // method@0005 00037c: 1250 |0008: const/4 v0, #int 5 // #5 00037e: 6301 0000 |0009: sget-boolean v1, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000 000382: 3901 0b00 |000b: if-nez v1, 0016 // +000b 000386: 1251 |000d: const/4 v1, #int 5 // #5 000388: 3210 0800 |000e: if-eq v0, v1, 0016 // +0008 00038c: 2201 0c00 |0010: new-instance v1, Ljava/lang/AssertionError; // class@000c 000390: 7010 0b00 0100 |0012: invoke-direct {v1}, Ljava/lang/AssertionError;.:()V // method@000b 000396: 2701 |0015: throw v1 000398: 0e00 |0016: return-void

লক্ষ্য করুন কীভাবে স্থিতিশীল কন্সট্রাক্টর ক্লাস অবজেক্টে পছন্দসই অ্যাসারশনস্ট্যাটাস পদ্ধতিটি আহ্বান করে এবং ক্লাস-ওয়াইড ভেরিয়েবল সেট করে; অ্যাসারেন্সডিজবল; এছাড়াও লক্ষ্য করুন যে অনক্রিট ()-তে, java.lang.AssertionError নিক্ষেপের সমস্ত কোডই সংকলিত আছে, তবে এটি কার্যকর করা স্ট্যাটিক কনস্ট্রাক্টরের ক্লাস অবজেক্টের জন্য নির্ধারিত $ assertionsDable এর মান অনুসারে কাজ করে।

এটি প্রদর্শিত হয় যে JUnit এর দৃsert় ক্লাসটি প্রধানত ব্যবহৃত হয়, সুতরাং এটি সম্ভবত এটির জন্য নিরাপদ বাজি। আসর্ট কীওয়ার্ডের নমনীয়তা হ'ল বিকাশের সময়ে দৃser়তাগুলি চালু করা এবং শিপিং বিটের জন্য এগুলি বন্ধ করে দেওয়া এবং পরিবর্তে কৌতুকপূর্ণভাবে ব্যর্থ হওয়া।

আশাকরি এটা সাহায্য করবে.


এটি প্রদর্শিত হয় গুগল ব্রাউজযোগ্য উত্সটি সরিয়ে নিয়েছে (আমি এখানে অন্যান্য প্রশ্নের উত্তরে এর উল্লেখগুলি দেখেছি)) আপনার সেরা বেট হয় হয় উত্স পাওয়া, বা এটি একটি অনুসন্ধান ইঞ্জিনে সন্ধান করার চেষ্টা করা। "ডালভিক / এমবেডড-ভিএম-কন্ট্রোল html" অনুসন্ধান করুন। এটির একটি জায়গা এখানে রয়েছে: assembla.com/code/android-gb-for-sharp-is01/git/nodes/dalvik/… । আশাকরি এটা সাহায্য করবে.
বৃশ্চিকমেঘ

খুব দরকারী, আপনাকে ধন্যবাদ। যদিও আমি দ্বিতীয় থেকে শেষ অনুচ্ছেদে তৈরি করা পার্থক্য দেখে বিভ্রান্ত হয়েছি। আমরা দু'ধরনের এ্যাসেরেট নিয়ে আলোচনা করছি: প্রথমটি হ'ল অ্যাসেটনোটনল () এর মতো ইউনাইট এ্যাসেট প্যাকেজের পদ্ধতি এবং দ্বিতীয়টি জাভা ল্যাঙ্গুয়েজ 'অ্যাসেট' কীওয়ার্ড। আপনার উত্তর উভয় প্রযোজ্য? উদাহরণস্বরূপ, যদি আমি import static junit.framework.Assert.*এবং তারপরে আমি এর একটি পদ্ধতি ব্যবহার করি, যেমন assertNotNull("It's null!", someObject);, শিপিং বিটে এই দাবিটি বন্ধ করা আছে?
জেফ্রো 21

4
হাই জেফ্রো, আমি এটি বিশ্বাস করি না - জুনিট.ফ্রেমওয়ার্ক sআস্রিটটি কেবল এমন এক শ্রেণি যা ইনপুট শর্তটি মিথ্যা বলে প্রমাণিত হওয়ার পরে একটি ব্যতিক্রম ছুঁড়ে ফেলে। অন্যদিকে আসর কীওয়ার্ডটি ভাষাতে অন্তর্নির্মিত। আশাকরি এটা সাহায্য করবে.
scorpiodawg

4
adb shell setprop debug.assert 1গ্রহন করার কোনও উপায় আছে কি ?
পেসারিয়ার

4
আপনি যদি রুট হন তবে ডিভাইসে চলমান একটি টার্মিনাল থেকেও জোর দেওয়া যেতে পারে। প্রথমে su, তারপর setprop debug.assert 1। দ্রষ্টব্য যে আপনি যে কোডটি ডিসেমাম্বলড দেখিয়েছেন তা একটি রিলিজ বিল্ডে থাকবে ( স্ট্যাকওভারফ্লো . com/ a/ 5590378 / 506073 )। আমি বিশ্বাস করি না যে জাভাক সংকলককে দৃ e়তা ছাড়তে না বলা যেতে পারে তাই তাদের কোনওভাবে বাইরে বেরিয়ে আসা দরকার। এটির একটি সহজ সমাধান হ'ল কীওয়ার্ডটি আপনার নিজের ফাংশনে দৃsert়ভাবে মোড়ানো যা আপনার জন্য অগ্রসর হতে পারে।
আহকক্স

10

যখন দাবিগুলি সক্ষম থাকে, বুলিয়ান এক্সপ্রেশন থাকে assertকীওয়ার্ডটি কেবল একটি নিক্ষেপ করে ।AssertionErrorfalse

সুতরাং আইএমও, সেরা বিকল্প, esp। আপনি জুনিটের উপর নির্ভর করতে যদি বিরক্ত AssertionErrorহন তবে নীচের মত প্রকাশিতভাবে স্পষ্টভাবে ছোঁড়াতে হবে :

assert x == 0 : "x = " + x;

উপরোক্ত বিবৃতিটির বিকল্প হ'ল:

Utils._assert(x == 0, "x = " + x);

পদ্ধতিটি যেখানে সংজ্ঞায়িত হয়েছে:

public static void _assert(boolean condition, String message) {
    if (!condition) {
        throw new AssertionError(message);
    }
}

ওরাকল জাভা ডক্স একটি গ্রহণযোগ্য বিকল্প হিসাবে নিক্ষেপ করার পরামর্শ দেয়AssertionError

আমার ধারণা আপনি উত্পাদন কোডের জন্য এই কলগুলি সরাতে প্রিগার্ডটি কনফিগার করতে পারেন।


তবে আপনি কীভাবে দাবিগুলি সক্ষম করবেন? অ্যান্ড্রয়েড স্টুডিওতে?
এসএমবিগস

8

"অনুশীলনে অ্যান্ড্রয়েড" এ এটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে:

$adb shell setprop dalvik.vm.enableassertions all

যদি এই সেটিংসটি আপনার ফোনে অব্যাহত না থাকে তবে আপনি /data/local.prop ফাইল তৈরি করতে পারেন এর মতো বৈশিষ্ট্য সহ:

dalvik.vm.enableassertions=all

প্রতি stackoverflow.com/a/18556839/2004714 , এছাড়াও আপনি নিশ্চিত যে ফাইল শুধুমাত্র পাঠযোগ্য তৈরি করা হয় করতে হবে পারে ( chmod 644)।
পাওলো

5

গুগল এ বিষয়টি যাচাই করা না হওয়া পযর্ন্ত আমার বক্তব্য কার্যকর হয়নি, আমার বক্তব্য কার্যকর হয়নি ... আমি সাধারণ বক্তব্য ছেড়ে দিয়েছি এবং জুনিয়টস স্টোরেশন পদ্ধতিতে যাব।

সুবিধার্থে আমি ব্যবহার করছি:

স্ট্যাটিক জুনিট.ফ্রেমে ওয়ার্ক.আসর্ট আমদানি করুন *

স্থির আমদানির কারণে আমি পরে লিখতে পারি:

assertTrue (...); পরিবর্তে Assert.assertTrue (...);


4

আপনি যদি ইউনাইট (বা অন্য কোনও শ্রেণীর পাথ) তে জোর দিয়ে শপিং কোড সম্পর্কে উদ্বিগ্ন হন তবে আপনি প্রোগুয়ার্ড কনফিগারেশন বিকল্পটি 'এসুওমেনোসাইডেফেক্টস' ব্যবহার করতে পারেন, যা এই ধারণাটি বর্ধিত করে যে এটি মুছে ফেলা কোডের কিছুই করে না a ।

যেমন

-assumenosideeffects junit.framework.Assert {
*;
}

আমার একটি সাধারণ ডিবাগ লাইব্রেরি রয়েছে যা আমি আমার সমস্ত পরীক্ষার পদ্ধতিতে রেখেছি এবং তারপরে আমার প্রকাশিত অ্যাপ্লিকেশনগুলি থেকে এটিকে ছাঁটাই করতে এই বিকল্পটি ব্যবহার করি।

এটি রিলিজ কোডে কখনও ব্যবহৃত হয় না এমন ম্যানিপুলেট করা স্ট্রিংগুলির হার্ড টু স্পট সমস্যাটিকে সরিয়ে দেয়। উদাহরণস্বরূপ, আপনি যদি ডিবাগ লগ পদ্ধতি লিখেন এবং সেই পদ্ধতিতে আপনি স্ট্রিংটি লগ করার আগে ডিবাগ মোডের জন্য পরীক্ষা করেন, আপনি এখনও স্ট্রিংটি নির্মাণ করছেন, মেমরি বরাদ্দ করছেন, পদ্ধতিটি কল করছেন, কিন্তু তারপরে কিছুই করবেন না। ক্লাসটি ছড়িয়ে দেওয়া তারপরে কলগুলি পুরোপুরি সরিয়ে দেয়, এর অর্থ যতক্ষণ আপনার স্ট্রিংটি মেথড কলের অভ্যন্তরে নির্মিত হয় ততক্ষণ তা চলে যায়।

প্রোগুয়ার্ডের কোনও অংশ যাচাই না করেই সম্পন্ন করা হয়েছে, তবে লাইনগুলি সরিয়ে ফেলা সত্যই নিরাপদ কিনা তা নিশ্চিত করুন। কোনও অকার্যকর রিটার্নিং পদ্ধতি সরিয়ে ফেলা ঠিক হবে, তবে আপনি যা অপসারণ করছেন তা থেকে যদি কোনও রিটার্ন মান নিচ্ছেন তবে নিশ্চিত হয়ে নিন যে আপনি সেগুলি প্রকৃত অপারেশনাল যুক্তির জন্য ব্যবহার করছেন না।


4
আমি মনে করি সঠিক বাক্য -assumenosideeffects class junit.framework.Assert { *; }
গঠনটি হ'ল

বিভ্রান্তিকর উত্তর। উল্লেখ করা কমান্ড অগ্রগতির ত্রুটির কারণ হয়ে থাকে। পুকস দ্বারা সংশোধিত কমান্ড এখনও বাইনারি ডেক্স ফাইল থেকে দাবিগুলি সরিয়ে দেয় না।
পয়েন্টার নুল

আমার @ পয়েন্টারনুল একই সমস্যা। দৃsert় প্রতিশ্রুতি মুছে ফেলা।
মাহদী

3

আপনি দৃser়তাগুলি ব্যবহার করতে পারেন তবে এগুলি নির্ভরযোগ্যভাবে ব্যবহার করতে কিছু কাজ লাগে। সিস্টেমের সম্পত্তি debug.assertঅবিশ্বস্ত; সমস্যাগুলি দেখুন 175697 , 65183 , 36786 এবং 17324

একটি পদ্ধতি হ'ল যে assertকোনও রানটাইম মোকাবেলা করতে পারে এমন প্রতিটি বাক্যে অনুবাদ করা। জাভা সংকলকটির সামনে উত্স প্রিপ্রোসেসর দিয়ে এটি করুন। উদাহরণস্বরূপ, এই বিবৃতি নিন:

assert x == 0: "Failure message";

একটি ডিবাগ বিল্ডের জন্য, আপনার প্রিপ্রেসেসর উপরেরটি একটি ifবিবৃতিতে অনুবাদ করবে :

{ if( !(x == 0) ) throw new AssertionError( "Failure message" ); }

একটি উত্পাদনের জন্য, একটি খালি বিবৃতিতে:

;

নোট করুন যে এটি রান টাইম (স্বাভাবিক অনুশীলন) এর বিপরীতে বিল্ডটাইম সময়ে দৃ .়তাগুলিকে নিয়ন্ত্রণ করবে।

আমি কোনও রেডিমেড প্রিপ্রোসেসর খুঁজে পাইনি, সুতরাং আমি একটি স্ক্রিপ্ট করেছি । অংশ হিসাবে দাবী সঙ্গে ডিল দেখুন। অনুলিপি করার জন্য লাইসেন্স এখানে


1

জুনিটকে বের করে দেওয়ার বিষয়ে জুলাক্সিয়ার জবাব যোগ করতে - প্রগার্ড ইতিমধ্যে অ্যান্ড্রয়েড এসডিকে /গ্রহণের অংশ এবং নীচের পৃষ্ঠাটি কীভাবে এটি সক্ষম করতে হবে তা আপনাকে জানিয়েছে।

http://developer.android.com/guide/developing/tools/proguard.html

উপরের ওস্তাদটি সর্বশেষতম ডিফল্ট অগ্রগতি কনফিগারেশনের সাথে কাজ করে না কারণ এটি -ডোনোপটিমাইজ পতাকা ব্যবহার করে যা অবশ্যই বের করা উচিত এবং কিছু অপ্টিমাইজেশন চালু রয়েছে।


0

স্ট্যান্ডার্ড জাভা অ্যাসেট কীওয়ার্ড ব্যবহার করুন , উদাহরণস্বরূপ:

assert a==b;

এটি কাজ করার জন্য, আপনাকে একটি লাইন / সিস্টেমে / বিল্ড.প্রপতে যুক্ত করতে হবে এবং ফোনটি রিবুট করতে হবে:

debug.assert=1

এটি রুট ফোনে কাজ করবে। বিল্ড.প্রপ (যেমন এক্স-প্লোর) সম্পাদনা করতে সক্ষম কিছু ফাইল ম্যানেজার ব্যবহার করুন।

প্লাসস: সর্বাধিক (সমস্ত?) অ্যান্ড্রয়েড ফোনগুলি জাহাজগুলি অ্যাসেসরেন্স অক্ষম করে। এমনকি যদি আপনার কোডটি ঘটনাক্রমে ভুল হিসাবে জোর দেয়, অ্যাপ্লিকেশন বাধাগ্রস্ত হবে না বা ক্রাশ হবে না। তবে, আপনার বিকাশের ডিভাইসে আপনি দৃ exception় ব্যতিক্রম পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.