Per T208755, pages will be bucketed in a 50/50 A/B test. Assume a 1% sampling rate and identify some pages that would be sampled and in the "treatment" bucket across wikis. 500+ pages each for at least two wikis per group should be identified. Note that as the sample rate is increased, these pages will remain in their "treatment" bucket. In human form, the query might look like:
In the page table, for pages in the main namespace with page_random in [.5, .505), print page_id, page_random, and page_title, order by popularity, limit 10000.
If you think of other fields useful for testing or debugging, feel free to include them.
Since you're in the database, do the same to generate a list of pages in the "control" bucket assuming a 100% sampling rate.
The results should be saved in a spreadsheet and distributed. are available in the Quarry links below (and can be downloaded as CSV from there if needed).
Note that the order of the bucket config matters and affects the query as noted in T208763. The page_random range for sampled new treatments was verified for the following config:
$wgWBClientSettings[ 'pageSchemaNamespaces' ] = [ 0 ]; $wgWBClientSettings[ 'pageSchemaSplitTestSamplingRatio' ] = 0.01; $wgWBClientSettings[ 'pageSchemaSplitTestBuckets' ] = [ 'control', 'treatment' ];
With the following test:
public function testScenarioAb1() { // "control" / "treatment" A/B test with 1% sampling. $sampling = 0.01; $buckets = [ /*A*/ 'control', /*B*/ 'treatment' ]; $subject = new PageSplitTester( $sampling, $buckets ); // Supply page_random at different values. [0, .005) and [.5, .505) are sampled, // [.005, .5) and [.505, 1) are unsampled. $this->assertEquals( true, $subject->isSampled( 0.000 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.001 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.002 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.003 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.004 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.005 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.008 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.009 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.010 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.011 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.012 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.013 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.015 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.018 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.019 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.100 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.200 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.490 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.500 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.501 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.502 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.503 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.504 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.505 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.508 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.509 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.510 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.800 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.999 ) ); // '' // Supply page_random at different values. [0, .5) are "control", [.5, 1) are "treatment". $this->assertEquals( 'control', $subject->getBucket( 0.000 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.001 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.002 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.003 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.004 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.005 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.008 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.009 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.010 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.011 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.012 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.013 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.015 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.018 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.019 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.100 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.200 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.490 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.500 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.501 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.502 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.503 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.504 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.505 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.508 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.509 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.510 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.800 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.999 ) ); // Thus, pages sampled at 1% in "treatment" may be found for page_random in [.5, .505). } public function testScenarioAb5() { // "control" / "treatment" A/B test with 1% sampling. $sampling = 0.05; $buckets = [ /*A*/ 'control', /*B*/ 'treatment' ]; $subject = new PageSplitTester( $sampling, $buckets ); // Supply page_random at different values. [0, .025) and [.5, .525) are sampled, // [.025, .5) and [.525, 1) are unsampled. $this->assertEquals( true, $subject->isSampled( 0.000 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.001 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.002 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.003 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.004 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.005 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.008 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.009 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.010 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.011 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.012 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.013 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.015 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.018 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.019 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.024 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.025 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.100 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.200 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.490 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.500 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.501 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.502 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.503 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.504 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.505 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.508 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.509 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.510 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.524 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.525 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.800 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.999 ) ); // '' // Supply page_random at different values. [0, .5) are "control", [.5, 1) are "treatment". $this->assertEquals( 'control', $subject->getBucket( 0.000 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.001 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.002 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.003 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.004 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.005 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.008 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.009 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.010 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.011 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.012 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.013 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.015 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.018 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.019 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.100 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.200 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.490 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.500 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.501 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.502 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.503 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.504 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.505 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.508 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.509 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.510 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.800 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.999 ) ); // Thus, pages sampled at 5% in "treatment" may be found for page_random in [.5, .525). } public function testScenarioAb25() { // "control" / "treatment" A/B test with 1% sampling. $sampling = 0.25; $buckets = [ /*A*/ 'control', /*B*/ 'treatment' ]; $subject = new PageSplitTester( $sampling, $buckets ); // Supply page_random at different values. [0, .125) and [.5, .625) are sampled, // [.125, .5) and [.625, 1) are unsampled. $this->assertEquals( true, $subject->isSampled( 0.000 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.001 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.002 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.003 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.004 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.005 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.008 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.009 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.010 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.011 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.012 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.013 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.015 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.018 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.019 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.024 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.025 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.100 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.124 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.125 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.200 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.490 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.500 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.501 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.502 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.503 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.504 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.505 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.508 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.509 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.510 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.524 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.525 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.624 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.625 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.800 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.999 ) ); // '' // Supply page_random at different values. [0, .5) are "control", [.5, 1) are "treatment". $this->assertEquals( 'control', $subject->getBucket( 0.000 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.001 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.002 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.003 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.004 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.005 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.008 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.009 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.010 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.011 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.012 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.013 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.015 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.018 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.019 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.100 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.200 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.490 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.500 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.501 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.502 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.503 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.504 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.505 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.508 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.509 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.510 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.800 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.999 ) ); // Thus, pages sampled at 25% in "treatment" may be found for page_random in [.5, .625). } public function testScenarioAb50() { // "control" / "treatment" A/B test with 1% sampling. $sampling = 0.5; $buckets = [ /*A*/ 'control', /*B*/ 'treatment' ]; $subject = new PageSplitTester( $sampling, $buckets ); // Supply page_random at different values. [0, .25) and [.5, .75) are sampled, // [.25, .5) and [.75, 1) are unsampled. $this->assertEquals( true, $subject->isSampled( 0.000 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.001 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.002 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.003 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.004 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.005 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.008 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.009 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.010 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.011 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.012 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.013 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.015 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.018 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.019 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.024 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.025 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.100 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.124 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.125 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.200 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.24 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.25 ) ); // 'Unsampled $this->assertEquals( false, $subject->isSampled( 0.490 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.500 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.501 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.502 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.503 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.504 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.505 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.508 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.509 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.510 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.524 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.525 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.624 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.625 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.74 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.75 ) ); // Unsampled $this->assertEquals( false, $subject->isSampled( 0.800 ) ); // '' $this->assertEquals( false, $subject->isSampled( 0.999 ) ); // '' // Supply page_random at different values. [0, .5) are "control", [.5, 1) are "treatment". $this->assertEquals( 'control', $subject->getBucket( 0.000 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.001 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.002 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.003 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.004 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.005 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.008 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.009 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.010 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.011 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.012 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.013 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.015 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.018 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.019 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.100 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.200 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.490 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.500 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.501 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.502 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.503 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.504 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.505 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.508 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.509 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.510 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.800 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.999 ) ); // Thus, pages sampled at 50% in "treatment" may be found for page_random in [.5, .75). } public function testScenarioAb100() { // "control" / "treatment" A/B test with 1% sampling. $sampling = 1; $buckets = [ /*A*/ 'control', /*B*/ 'treatment' ]; $subject = new PageSplitTester( $sampling, $buckets ); // Supply page_random at different values. [0, 1) are sampled. $this->assertEquals( true, $subject->isSampled( 0.000 ) ); // Sampled $this->assertEquals( true, $subject->isSampled( 0.001 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.002 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.003 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.004 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.005 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.008 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.009 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.010 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.011 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.012 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.013 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.015 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.018 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.019 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.024 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.025 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.100 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.124 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.125 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.200 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.24 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.25 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.490 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.500 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.501 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.502 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.503 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.504 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.505 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.508 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.509 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.510 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.524 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.525 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.624 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.625 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.74 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.75 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.800 ) ); // '' $this->assertEquals( true, $subject->isSampled( 0.999 ) ); // '' // Supply page_random at different values. [0, .5) are "control", [.5, 1) are "treatment". $this->assertEquals( 'control', $subject->getBucket( 0.000 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.001 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.002 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.003 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.004 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.005 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.008 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.009 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.010 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.011 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.012 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.013 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.015 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.018 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.019 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.100 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.200 ) ); $this->assertEquals( 'control', $subject->getBucket( 0.490 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.500 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.501 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.502 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.503 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.504 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.505 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.508 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.509 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.510 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.800 ) ); $this->assertEquals( 'treatment', $subject->getBucket( 0.999 ) ); // Thus, pages sampled at 50% in "treatment" may be found for page_random in [.5, 1). }
Please review the assertions of this test prior to executing the query to ensure that correct values are used for page_random.
Since you're in the there already, might as well report any unexpected values for page_random too:
In the page table, for pages in the main namespace where page_random is false, null, or otherwise not in [0, 1), print the page_id, page_random, and page_title, order by popularity, limit 10000
If there are unexpected values in the database, this may affect the A/B test as well as logstash errors reported.
No known bad values detect on wiki spot check but the queries ran suspiciously fast:
Developer notes
- What does a developer need to be able to have access to these database tables? (please add link to wiki page)
- Please explicitly list the outcomes as a checklist in "sign off steps"/"outputted documents"
Results
Please use these results when you need to find a page that's been both bucketed in the new treatment _and_ sampled. As the sample rate increases from 0% to 1%, 1% to 5%, 5% to 25%, 25% to 50%, and 50% to 100%, you should see these pages transition from the old version (no SEO linked data) to the new treatment (SEO linked data is shown).