যেখানে একটি পরীক্ষা অন্য পরীক্ষার সেটআপ হয় সেখানে পরীক্ষাগুলি কীভাবে গঠন করবেন?


18

আমি কেবলমাত্র সর্বজনীন এপিআই ব্যবহার করে একটি সিস্টেমের পরীক্ষা করছি ration আমার একটা পরীক্ষা আছে যা দেখতে দেখতে এরকম কিছু দেখাচ্ছে:

def testAllTheThings():
  email = create_random_email()
  password = create_random_password()

  ok = account_signup(email, password)
  assert ok
  url = wait_for_confirmation_email()
  assert url
  ok = account_verify(url)
  assert ok

  token = get_auth_token(email, password)
  a = do_A(token)
  assert a
  b = do_B(token, a)
  assert b
  c = do_C(token, b)

  # ...and so on...

মূলত, আমি একক লেনদেনের পুরো "প্রবাহ" পরীক্ষা করার চেষ্টা করছি। প্রবাহের প্রতিটি পদক্ষেপ পূর্ববর্তী পদক্ষেপ সাফল্যের উপর নির্ভর করে। আমি নিজেকে বাহ্যিক এপিআই-তে সীমাবদ্ধ করে রাখছি, তাই আমি কেবল ডাটাবেসের মধ্যে মান পোক করতে পারি না।

সুতরাং, হয় আমার কাছে সত্যিই দীর্ঘ পরীক্ষার একটি পদ্ধতি রয়েছে যা `এ; জাহির করা; বি; জাহির করা; সি; দৃsert়তা ... ", বা আমি এটি পৃথক পরীক্ষার পদ্ধতিতে বিভক্ত করেছি, যেখানে প্রতিটি পরীক্ষা পদ্ধতিতে এটি করার আগে পূর্ববর্তী পরীক্ষার ফলাফলের প্রয়োজন হয়:

def testAccountSignup():
  # etc.
  return email, password

def testAuthToken():
  email, password = testAccountSignup()
  token = get_auth_token(email, password)
  assert token
  return token

def testA():
  token = testAuthToken()
  a = do_A(token)
  # etc.

আমি মনে করি এই গন্ধ। এই পরীক্ষাগুলি লেখার আরও ভাল উপায় আছে কি?

উত্তর:


10

যদি এই পরীক্ষাটি ঘন ঘন চালানোর উদ্দেশ্যে হয় , তবে আপনার উদ্বেগগুলি বরং এই ফলাফলগুলির সাথে কাজ করার প্রত্যাশিতদের জন্য সুবিধাজনক উপায়ে পরীক্ষার ফলাফলগুলি কীভাবে উপস্থাপন করা যায় তার দিকে নিবদ্ধ থাকবে ।

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

পৃথক পদ্ধতিগুলি আরও বেশি আবেদনময়ী দেখায়, কারণ পুনরায় রানগুলির ফলাফল (কোডগুলিতে বাগগুলি ঠিক করার ক্ষেত্রে অবিচ্ছিন্ন অগ্রগতি ধরে নেওয়া) এর মত দেখতে পাওয়া যেতে পারে:

    FAIL FAIL FAIL FAIL
    PASS FAIL FAIL FAIL -- 1st stage fixed
    PASS FAIL FAIL FAIL
    PASS PASS FAIL FAIL -- 2nd stage fixed
    ....
    PASS PASS PASS PASS -- we're done

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

ফলস্বরূপ, পরীক্ষার বিকাশকারীরা অবশেষে অতিরিক্ত SKIPস্ট্যাটাস সহ তাদের কাঠামোটি প্রসারিত করতে এবং টেস্ট ম্যানেজার কোডে নির্ভরশীল পরীক্ষাগুলির সম্পাদন বাতিল করতে SKIPএবং রিপোর্ট থেকে প্যাড পরীক্ষার ফলাফলগুলি ফেলে দেওয়ার একটি বিকল্প যুক্ত করতে বাধ্য হয়েছিল, যাতে এটি দেখতে দেখতে:

    FAIL -- the rest is skipped
    PASS FAIL -- 1st stage fixed, abort after 2nd test
    PASS FAIL
    PASS PASS FAIL -- 2nd stage fixed, abort after 3rd test
    ....
    PASS PASS PASS PASS -- we're done

1
আমি যেমন এটি পড়েছি, মনে হচ্ছে আসলে একটি টেস্টআল থিটিংস লিখতে ভাল হত তবে এটি কোথায় ব্যর্থ হয়েছে তার স্পষ্ট প্রতিবেদন দিয়ে।
জাভিয়ের

2
@Javier যেখানে এটি ব্যর্থ সুস্পষ্ট প্রতিবেদন তত্ত্ব শব্দসমূহ চমৎকার, কিন্তু আমার অনুশীলন, যখনই পরীক্ষা ঘন ঘন মৃত্যুদন্ড কার্যকর করা হয়, এই জোরালোভাবে এইজন্য পছন্দ বোবা পাস-ফেল যাদের পরিশ্রমী মধ্যে টি টোকেন
মশা

7

আমি টেস্টিং কোডটি সেটআপ কোড থেকে আলাদা করব। সম্ভবত:

# Setup
def accountSignup():
    email = create_random_email()
    password = create_random_password()

    ok = account_signup(email, password)
    url = wait_for_confirmation_email()
    verified = account_verify(url)
    return email, password, ok, url, verified

def authToken():
    email, password = accountSignup()[:2]
    token = get_auth_token(email, password)
    return token

def getA():
    token = authToken()
    a = do_A()
    return a

def getB():
    a = getA()
    b = do_B()
    return b

# Testing
def testAccountSignup():
    ok, url, verified = accountSignup()[2:]
    assert ok
    assert url
    assert verified

def testAuthToken():
    token = authToken()
    assert token

def testA():
    a = getA()
    assert a

def testB():
    b = getB()
    assert b

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


1
আপনার জন্য +1! পরীক্ষাগুলি কোড হয় এবং ডিআরওয়াই পরীক্ষার ক্ষেত্রে এটি যতটা প্রযোজ্য তেমন প্রয়োগ করে।
ডগএম

2

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


1

ঠিক আছে, আমি এখানে "এয়ার কোডিং" দ্বারা পাইথন সিনট্যাক্সটি এখনই পেতে পারি না, তবে আমি ধারণা করি আপনি এই ধারণাটি পেয়েছেন: আপনি এই জাতীয় কোনও কার্যকারিতা বাস্তবায়ন করতে পারেন:

def asserted_call(create_random_email,*args):
    var result=create_random_email(*args)
    assert result
    return result

যা আপনাকে আপনার পরীক্ষাগুলি এভাবে লিখতে দেয়:

  asserted_call(account_signup, email, password)
  url = asserted_call(wait_for_confirmation_email)
  asserted_call(account_verify,url)
  token = asserted_call(get_auth_token,email, password)
  # ...

অবশ্যই, এটি বিতর্কযোগ্য যদি এই পদ্ধতির পাঠযোগ্যতার ক্ষয়টি এটি ব্যবহারের পক্ষে মূল্যবান হয় তবে এটি বয়লারপ্লেট কোডটি কিছুটা কমিয়ে দেয়।

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