ஓரலகு சோதனைகளில் போலிகளின் பயன்பாடு

ஓரலகு சோதனைகளில் சோதிக்கப்படும் வர்க்கத்தின் சார்புகளின் செயல்பாட்டை போலிகளைக்கொண்டு உருவகப்படுத்தலாம் என முந்தைய பதிவுகளில் அறிந்தோம். போலிகளைப் பயன்படுத்த சில கட்டமைப்புகள் உருவாக்கப்பட்டுள்ளன. Java-வில், easymock, powermock, mockito, Ruby-யில் rspec-mocks, C#-க்கு Moq போன்றவை இவற்றுள் சில.

ஒரு எடுத்துக்காட்டுடன் போலிகளின் பயன்பாட்டை பற்றி அறிய முயல்வோம். நாம் முந்தைய பதிவுகளில் பார்த்த உதாரணத்தில், திருப்பியமைக்கபட்ட சரத்தை ஒரு கோப்பில் சேமித்து வைக்கவேண்டும் என்ற புதிய தேவையை எடுத்துக்கொண்டு போலிகளைப் பயன்படுத்தி பார்க்கலாம். அதற்கான சோதனையை பின்வருமாறு எழுதலாம்.

require './string_util'

describe StringUtil do
  it 'should reverse a string' do
    string_util = StringUtil.new
    expected_string = 'tset a si sihT'
    expect(File).to receive(:write).with('sample_file.txt', expected_string)

    reversed_string = string_util.reverse('This is a test')

    expect(reversed_string).to eq expected_string
  end
end

இதில்

expect(File).to receive(:write).with('sample_file.txt', expected_string)

கவனிக்கப்படவேண்டிய வரி. இதில் ‘File’ என்ற வர்க்கத்தின் (class) ‘write’ என்ற செயற்கூறு (method) ‘sample_file.txt’ மற்றும் ‘expected_string’ ஆகிய மாறிகளைக்கொண்டு (variables) அழைக்கப்படவேண்டும் என்ற எதிர்பார்ப்பை பதிவு செய்கிறோம். இந்த சோதனையை இயக்கும்பொழுது தோல்வியடைகிறது.

நாம் எதிர்பார்த்தபடி இந்த செயற்கூறு அழைக்கபடவில்லையென இந்த வெளியீட்டிலிருந்து அறிகிறோம். நிரலில் இந்த செயல்பாட்டை பின்வரும் மாற்றங்களைச்செய்யலாம்.

class StringUtil
  def reverse a_string
    reversed_string = a_string.reverse
    File.write(‘sample_file.txt’, reversed_string)
    reversed_string
  end
end

இதில்,

File.write(‘sample_file.txt’, reversed_string)

என்ற நிரல்வரியில், sample_file.txt என்ற கோப்பில், திருப்பியமைத்த சரத்தை எழுதுகிறோம். இப்போது சோதனையை இயக்கினால் அது தேர்ச்சியடைகிறது.

இங்கே ஒரு சரத்தை கோப்பில் எழுதுவது எப்படி என்பது, File என்ற வர்க்கத்தின் வேலை. மற்ற நிரல்மொழிகளைப்போல, ரூபியிலும், இது உட்பொத்திந்துள்ளது (built-in). ஏற்கனவே, ரூபி மொழியின் உருவாக்குநர்களால் சோதிக்கபட்டிருக்கிறது. எனவே, சேமிக்கப்பட்ட கோப்பைப் படித்து, அதில் நாம் விரும்பிய சரம் எழுதப்பட்டுள்ளதா என நாம் சோதிக்கத்தேவையில்லை. அதனால், உண்மையான File வர்க்கதிற்குப்பதிலாக, போலியைப்பயன்படுத்தி சோதிக்கிறோம்.

 

உட்பொதிந்த வர்க்கங்களுக்கு மட்டுமல்லாது, சோதனைக்குட்பட்டுள்ள வர்க்கத்தின் சார்புகளுக்கும் போலிகளைப் பயன்படுத்தலாம். ஒரு உதாரணத்துடன் இதைப்புரிந்துகொள்ள முயல்வோம்.

ஒரு வலைப்பதிவுதளத்தை எடுத்துக்கொள்ளலாம். ஒரு பதிவை சமர்ப்பித்தவுடன், சந்தாதாரர்களுக்கு மின்னஞ்சல் அனுப்பவேண்டும். மின்னஞ்சல் அனுப்பும் சேவையை ஏற்கனவே உருவாக்கிவிட்டோமா, அல்லது, அதற்கான பணிகள் இனிமேல் தான் தொடங்கவிருக்கிறதா என்பது பற்றி நமக்கு கவலையில்லை. பதிவை சமர்ப்பிக்கும் செயற்கூற்றில், மின்னஞ்சல் சேவையிடம் அந்த பணியை ஒப்படைத்தால் மட்டும் போதுமானது. இதற்கான சோதனையை முதலில் எழுதலாம்.

require './post.rb'
require './email_service.rb'

describe Post do
  describe '#submit' do
    it 'should send mail' do
      post = Post.new({:title => 'New post', :author => 'someone'})
      expect(EmailService).to receive(:send_mail).with('New post', 'someone')
      post.submit
    end
  end
end

இங்கே,

expect(EmailService).to receive(:send_mail).with('New post', 'someone')

என்ற வரி, மின்னஞ்சல் சேவையின் ‘send_mail’ செயற்கூறு அழைக்கப்படவேண்டும் என்ற எதிர்பார்ப்பை பதிவு செய்கிறது.

 

இது போலிகளின் நேர்மறையான நிகழ்வோட்டத்தின் (positive scenario) பயன்பாடாகும். போலிகளின் மற்றொரு முக்கிய பயன்பாடு எதிர்மறையான நிகழ்வோட்டங்களைச் (negative scenarios) சோதிப்பதாகும். எதிர்மறை நிகழ்வோட்டங்களை உருவகப்படுத்தும் ஆற்றலை போலிகள் நமக்கு தருகின்றன. நிரல் உருவாக்கத்தின் போதும், சோதனையாளர் புகாரிடும் தவறுகளை சரிபடுத்தும் போதும், இது பெரிதும் பயனுள்ளதாகிறது.

எ.கா: ஏதோ ஒரு காரணத்தால், மின்னஞ்சல் அனுப்பமுடியவில்லை. மின்னஞ்சல் சேவை exception ஏற்பட்டுவிட்டதெனில், வலைத்தள நிர்வாகிக்கு தெரியப்படுத்தவேண்டும். இதற்கான சோதனை பின்வருமாறு,

require './post.rb'
require './email_service.rb'
require './admin.rb'

describe Post do
  describe '#submit' do
    it 'should notify admin if sending email fails' do
      post = Post.new({:title => 'New post', :author => 'someone'})
      expect(EmailService).to receive(:send_mail).and_throw('Something went wrong!')
      expect(Admin).to receive(:notify)
      
      post.submit
    end
  end
end

இதன் வெளியீடு,

இது போன்ற பலவகையான நிகழ்வோட்டங்களை சோதிப்பதற்கு போலிகள் பயன்படுகின்றன. சார்புகளுடனான தொடர்பு குறித்த எல்லாவகையான சாத்தியக்கூறுகளையும் போலிகளைக்கொண்டு சோதிக்க முடியும். எந்தெந்த சார்புகளுடன் தொடர்பு இருக்கவேண்டும் என சோதிப்பது மட்டுமல்லாது, எந்தெந்த சார்புகளுடன் தொடர்பு இருக்கக்கூடாது என்பதையும் போலிகளில் பதிவு செய்து சோதிக்கலாம். மேற்கண்ட நேர்மறையான நிகழ்வோட்டத்தில் (மின்னஞ்சல் சரியாக அனுப்பபட்டபிறகு) தள நிர்வாகிக்கு தகவல் அனுப்புவது அவசியமில்லாதது. இதையும் போலிகளைக்கொண்டு உறுதிப்படுத்தலாம்.

require './post.rb'
require './email_service.rb'
require './admin.rb'

describe Post do
  describe '#submit' do
    it 'should send mail' do
      post = Post.new({:title => 'New post', :author => 'someone'})
      expect(EmailService).to receive(:send_mail).with('New post', 'someone')
      expect(Admin).to_not receive(:notify)
      post.submit
    end
  end
end

-இல. கலாராணி (lkalarani@gmail.com)

%d bloggers like this: